链接
题目描述
给你 n 个互不相同的数,然后你可以把它分成两类。
两个类分别有一个数字 a,b,如果数字 i 在第一类那 a-i 也要在第一类,如果在第二类就是 b-i。
然后问你是否有一个方法可以分类并满足条件。
思路
连图,判断是否可以
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
bool zih[100005], zh, anss;
int vis[100005], p[100005], h[100005], w[100005], v[100005];
int n, T, t, num, a, b;
struct node
{
int to, next;
}g[10000005];
void add(int x, int y)
{
g[++t] = (node){
y, h[x]}; h[x] = t;
g[++t] = (node){
x, h[y]}; h[y] = t;
}
void dfs(ll x)
{
if(vis[x]) return;
vis[x] = 1;
if(zih[x]) zh = 1;
++num;
for(ll i = h[x]; i; i = g[i].next)
{
ll to = g[i].to;
dfs(to);
}
}
void clean()
{
memset(h, 0, sizeof(h));
memset(vis, 0, sizeof(vis));
memset(zih, 0, sizeof(zih));
t = 0;
}
int main()
{
scanf("%d", &T);
while(T--)
{
clean();
scanf("%d", &n);
scanf("%d%d", &a, &b);
for(int i = 1; i <= n; ++i)
scanf("%d", &p[i]);
sort(p + 1, p + n + 1);
for(int i = 1; i <= n; ++i)
{
// v[i] = lower_bound(p + 1, p + n + 1, w[i]) - p;
int p1 = lower_bound(p + 1, p + n + 1, a - p[i]) - p;
int p2 = lower_bound(p + 1, p + n + 1, b - p[i]) - p;
if(a - p[i] == p[i]) zih[i] = 1;
if(b - p[i] == p[i]) zih[i] = 1;
if(p[p1] == a - p[i]) add(i, p1);
if(p[p2] == b - p[i]) add(i, p2);
}
anss = 0;
for(int i = 1; i <= n; ++i)
{
if(!vis[i])
{
num = 0, zh = false;
dfs(i);
if(zh) continue ;
if(num & 1)
{
anss = 1;
printf("NO\n");
break;
}
}
}
if(!anss) printf("YES\n");
}
}