现在的位置: 首页 > 综合 > 正文

Codeforces 468B Two Sets(二分图匹配)

2019年08月20日 ⁄ 综合 ⁄ 共 810字 ⁄ 字号 评论关闭

题目链接:Codeforces 468B Two Sets

题目大意:给出n个数,要求将n个数分配到两个集合中,集合0中的元素x,要求A-x也再0中,同理1集合。

解题思路:类似二分图匹配的方法。

#include <cstdio>
#include <cstring>
#include <map>
#include <stack>
#include <algorithm>

using namespace std;

const int maxn = 1e5 + 5;

int N, A, B, x[maxn], v[maxn], r = 0;
map<int, int> G;

bool match (int a, int M, int k) {
    int p = G[a];

    if (!G.count(M - a))
        return false;

    int q = G[M - a];

    if (v[q] == -1 || a * 2 == M) {
        v[p] = v[q] = k;
    } else {

        if (match(A + B - 2 * M + a, M, k))
            v[p] = v[q] = k;
        else
            return false;
    }
    return true;
}

bool solve () {
    if (r >= max(A,B))
        return false;

    for (int i = 1; i <= N; i++) {
        if (v[i] != -1)
            continue;

        if (!match(x[i], A, 0) && !match(x[i], B, 1))
            return false;
    }
    return true;
}

int main () {
    scanf("%d%d%d", &N, &A, &B);
    memset(v, -1, sizeof(v));

    for (int i = 1; i <= N; i++) {
        scanf("%d", &x[i]);
        r = max(x[i], r);
        G[x[i]] = i;
    }

    if (solve()) {
        printf("YES\n");
        for (int i = 1; i <= N; i++)
            printf("%d%c", v[i], i == N ? '\n' : ' ');
    } else
        printf("NO\n");
    return 0;
}

抱歉!评论已关闭.