http://codeforces.com/group/1EzrFFyOc0/contest/469/problem/D
题意:给n个互不相同的数以及两数a,b,有两个类A,B。
对于n个数中的任意数x,若x在A中,a-x也必在A中;若x在B中,b-x也必在B中。试问这组数满足上述条件否?若满足则输出YES,并说明第i个数属于第几类(类别用0,1表示);若不满足,则输出NO。
样例:4 5 9 YES
2 3 4 5 0 0 1 1
3 3 4 NO
1 2 4
题解:该题可用并查集解,由于x的范围过大,先用map离散化一下。
我们将类A的其中一个叶子定为n+1,类B其中一个叶子定为n+2。
对于任意的c[i]:
若a-c[i]存在,则c[i]和a-c[i]必在同一类中但不知道在哪个类中。
很好想,若c[i]在A中,则a-c[i]必须也在A中和c[i]配对;若c[i]在B中,a-c[i]若在A中,则不存在与其配对的c[i](n个数各不相同),则该情况不可能存在,即a-c[i]也在B中。
若a-c[i]不存在,则c[i]只可能在B中。
对于b-c[i]存在的讨论同理,若b-c[i]存在,则其与c[i]在同一集合,若不存在,则c[i]可能在A中。
若满足条件,A,B两棵树应该无交集,即find(n+1)!=find(n+2)。对于每个c[i],只需要看find(c[i])等于find(n+1)还是find(n+2)从而得出其在哪个类中。
若不满足,直接输出NO即可。
满足条件时:
AC代码:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include