Codeforces#429

比赛地址:Codeforces Round #429 (Div. 2)

A.Generous Kefa

题解:
直接判断最多的字符串的个数是否小于K

B.Godsend

题解:
当总数是奇数的时候,first直接赢,当sum是偶数的时候,若没有奇数的数,second赢,若有的话,取一个奇数的数,下一轮的时候first赢。所以,除非全是偶数,否自first赢。

C.Leha and Function

题解:
猜出的构造方法,直接大的匹配小的。。。
证明就不看了,太麻烦。。。

D.Leha and another game about graph

题意:
给你一个图,每个点有一个d[i](0,1,-1),现在要你选一些边,使每个不为-1的点的度deg[i]%2==d[i]。
题解:
可以发现对于这些d[i]=0的点可以先不管,因为可以一条边都不选,然后对于为1的点,我们只需要两两通过某种路径连接起来就好了,如果多出一个1的点,那么找一个-1的点连起来就好了,路径上的为0的点,进1个出1个边,对度不影响。
代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

vector<int> v[3 * 100010], id[3 * 100010];
int odd[3 * 100010], d[3 * 100010];
int N, M;
vector<int> id1, id2;
vector<int> ans;
bool visit[3 * 100010];

void dfs(int pos, int edge) {
    visit[pos] = true;
    for (int i = 0; i < v[pos].size(); i++) {
        if (visit[v[pos][i]])   continue;
        dfs(v[pos][i], id[pos][i]);
        if (odd[v[pos][i]]) {
            odd[pos] ^= 1;
        }
    }
    if (odd[pos]) {
        ans.push_back(edge);
    }
}

int main() {
    cin >> N >> M;
    for (int i = 1; i <= N; i++) {
        v[i].clear();
        id[i].clear();
    }
    int cnt1 = 0, cnt11 = 0;
    id1.clear();
    id2.clear();
    for (int i = 1; i <= N; i++) {
        cin >> d[i];
        if (d[i] == -1) {
            cnt11++;
            id2.push_back(i);
        }
        else if (d[i] == 1) {
            cnt1++;
            id1.push_back(i);
        }
    }
    for (int i = 0; i < M; i++) {
        int temp1, temp2;
        cin >> temp1 >> temp2;
        v[temp1].push_back(temp2);
        v[temp2].push_back(temp1);
        id[temp1].push_back(i+1);
        id[temp2].push_back(i+1);
    }
    if ((cnt1 & 1) && cnt11 == 0) {
        cout << "-1" << endl;
    }
    else {
        memset(odd, 0, sizeof(odd));
        for (int i = 1; i < id1.size(); i += 2) {
            odd[id1[i]] = 1;
            odd[id1[i - 1]] = 1;
        }
        if (cnt1 & 1) {
            odd[id1[cnt1 - 1]] = 1;
            odd[id2[0]] = 1;
        }
        memset(visit, false, sizeof(visit));
        ans.clear();
        dfs(1, -1);
        cout << ans.size() << endl;
        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i] << endl;
        }
    }
    return 0; 
}

E. On the Bench

题意 :
求相邻的元素相乘不为平方数的方案数
题解:
竟然是dp。。。。
我先看看解法先。。。
待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值