Codeforces Round#429(Div.2)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round#429(Div.2)相关的知识,希望对你有一定的参考价值。

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)的主要内容,如果未能解决你的问题,请参考以下文章

codeforces round #429 div2

Codeforces Round #429 (Div. 2) 841B Godsend(签到题)

Codeforces Round#429(Div.2)

Codeforces Round #429 (Div. 2) 841A. Generous Kefa(签到题)

Codeforces Round #429 (Div. 2)ABC

CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)