Test instructions: divides n different numbers into 2 sets.
Analysis: Divided into two trees. If two trees are connected together, this indicates that there is a point shared or not satisfied with a, b relationship, then output no;
Examples:
Input
4 5 9
2 3 4 5
Output
YES
0 0 1 1
Input
3 3 4
1 2 4
Output
NO
#include <iostream> #include <cstdio> #include <cstdlib> #include <map> using namespace std;
const int MAXN = 1E5+10;
int PRE[MAXN],ARR[MAXN];
Map<int,int> MP; void init (int n) {for (int i=1;i<n+3;i++) pre[i]=i;} int finds (int x) {if (x==pre[x]) return x
;
return pre[x] = finds (Pre[x]);
} void Unions (int x,int y) {int fx = finds (x);
int fy = finds (y);
if (fx!=fy) {pre[fx] = FY;
}//printf ("x=%d y =%d fx =%d fy =%d \ n", x,y,fx,fy);
} int main () {int n,a,b;
scanf ("%d%d%d", &n,&a,&b);
for (int i=1;i<=n;i++) {scanf ("%d", &arr[i]);
Mp[arr[i]]=i;
} init (n);
for (int i=1;i<=n;i++) {if (Mp[a-arr[i]]) unions (i,mp[a-arr[i]]);
else Unions (I,N+2);
if (Mp[b-arr[i]]) unions (i,mp[b-arr[i]);
else Unions (I,N+1); } if (finds (n+1) ==finds (n+2)) PRINTF ("no\n");
else {printf ("yes\n");
for (int i=1;i<=n;i++) {if (i>1) printf ("");
if (Finds (n+1) ==finds (Mp[arr[i])) printf ("0");
else printf ("1");
} printf ("\ n");
} return 0;
}