码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round#429(Div.2)

时间:2017-08-22 10:31:09      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:个数   cti   func   can   logs   about   tin   并查集   and   

A. Generous Kefa

如果有字母的个数大于k则NO

#include<bits/stdc++.h>
using namespace std;
int arr[28],n,k;
string str;
int main(){
    cin>>n>>k;
    cin>>str;
    for(int i = 0;i<str.length();i++){
        arr[(int)(str[i]-a)]++;
    }
    for(int i = 0;i<26;i++){
        if(arr[i] > k )return 0*printf("NO");
    }
    printf("YES");
    return 0;
} 

B. Godsend

如果和为奇数first直接赢,如果没有奇数second直接赢,有的话拿走奇数个奇数

数组中有奇数个奇数,second无论怎么拿都是first赢

#include<bits/stdc++.h>
using namespace std;
int arr[1000100],n,sum,even,odd;
int main(){
    cin>>n;
    for(int i = 0;i<n;i++){
        scanf("%d",&arr[i]);
        if(arr[i]%2) odd++;
        else even++;
        sum+=arr[i];
    } 
    if(sum%2 || odd) return 0*printf("First");
    else return 0*printf("Second");
    return 0;
}

C. Leha and Function

数论水平太差……总之b中最小数配a中最大数找规律过的,代码就不贴了

D. Leha and another game about graph

先判不行的情况,如果有奇数个1,没有-1一定不行

从任一节点dfs,看别人的代码在dfs完所有子树后都有这样的操作 if(d[to] == 1) d[pos] ^= 1

想了好久,模拟了一下,也就是从靠近树叶的d为1的节点回溯,如果父节点为0改为1,为-1则直接找到停下来

另外还要用并查集去环

#include<bits/stdc++.h>
using namespace std;
#define MAXN    300005
struct edge {int dest, num; };
int n, m, f[MAXN];
int cnt, ans[MAXN];
int root, d[MAXN];
vector <edge> a[MAXN];
void work(int pos, int fa) {
    for (unsigned i = 0; i < a[pos].size(); i++) {
        if (a[pos][i].dest == fa) continue;
        work(a[pos][i].dest, pos);
        if (d[a[pos][i].dest] == 1) {
            ans[++cnt] = a[pos][i].num;
            if (d[pos] != -1) d[pos] ^= 1;
        }
    }
}
int F(int x) {
    if (f[x] == x) return x;
    else return f[x] = F(f[x]);
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &d[i]);
        f[i] = i;
    }
    for (int i = 1; i <= m; i++) {
        int x, y;
        scanf("%d%d", &x, &y);
        if (F(x) == F(y)) continue;
        f[F(x)] = F(y);
        a[x].push_back((edge) {y, i});
        a[y].push_back((edge) {x, i});
    }
    root = 1;
    for (int i = 1; i <= n; i++)
        if (d[i] == -1) {
            root = i;
            break;
        }
    work(root, 0);
    if (d[root] == 1) printf("-1\n");
    else {
        printf("%d\n", cnt);
        for (int i = 1; i <= cnt; i++)
            printf("%d ", ans[i]);
        printf("\n");
    }
    return 0;
}

 

Codeforces Round#429(Div.2)

标签:个数   cti   func   can   logs   about   tin   并查集   and   

原文地址:http://www.cnblogs.com/Invisible-full-moon/p/7409762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!