Codeforces 469D Two Sets 题解

本文介绍了一个使用并查集解决特定数值分组问题的方法。问题要求将一组数分为两组,使得若某个数x属于A组,则a-x也必须在A组;若x属于B组,则b-x也在B组。文章详细解释了如何通过并查集来实现这一目标,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意
有n个数,要分成A、B两组,要求如果x∈A则a-x∈A,如果x∈B则b-x∈B,问是否存在一种符合要求的分法
思路
并查集,先增加两个点表示A和B集合的根,对于一个数x,如果a-x存在就把x和a-x放一起,否则就将x和B的根相连,如果b-x存在就把x和b-x放一起,否则就将x和A的根相连,最后看一下A和B集合的根是否相连就可以判断出有没有解了,至于分法就看这个数是和A的根相连还是B的根相连了


#include <cstdio>
#include <map>
#include <vector>
using namespace std;
int num[100003];
int father[100003];
map<int,int> hsh;
int n,a,b,f;
int findfather(int x)
{
    if(father[x]==x)
        return x;
    else return father[x]=findfather(father[x]);
}
int main()
{
    scanf("%d%d%d",&n,&a,&b);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num[i]);
        hsh[num[i]]=i;
    }
    for(int i=1;i<=n+2;i++)
        father[i]=i;
    for(int i=1;i<=n;i++)
    {
        if(hsh[a-num[i]]==0)
            father[findfather(i)]=findfather(n+2);
        else father[findfather(i)]=findfather(hsh[a-num[i]]);
        if(hsh[b-num[i]]==0)
            father[findfather(i)]=findfather(n+1);
        else father[findfather(i)]=findfather(hsh[b-num[i]]);
    }
    if(findfather(n+1)==findfather(n+2))
        printf("NO\n");
    else
    {
        printf("YES\n");
        for(int i=1;i<n;i++)
            if(findfather(i)==findfather(n+1))
                printf("0 ");
            else printf("1 ");
        if(findfather(n)==findfather(n+1))
            printf("0\n");
        else printf("1\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值