有點長→CF547DMike and Fish。node
其實也沒什麼好分析的,我這也是看的題解。c++
(不過,那篇題解好像文字的代碼不太對勁)ide
這裏直接說作法,正確性自證:spa
對輸入的,將橫、縱座標相等的點分別兩兩連邊,以後只須要dfs跑一個染色,使得一條邊兩個端點顏色都不同便可,這樣就能夠肯定每個點放紅色仍是藍色,輸出便可。(至於哪一個是紅哪一個是藍不重要,有spj)code
代碼:blog
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=500005;int n,m; 4 struct node{int y,nxt;}e[2*N]; 5 int h[N],c=1,vis[N],ans[N][2]; 6 void add(int x,int y){ 7 e[++c]=(node){y,h[x]};h[x]=c; 8 e[++c]=(node){x,h[y]};h[y]=c; 9 } void dfs(int x,int y){ 10 if(vis[x]) return ;vis[x]=y; 11 for(int i=h[x];i;i=e[i].nxt) 12 dfs(e[i].y,1^y); 13 } int main(){ 14 scanf("%d",&n); 15 for(int i=1,x,y;i<=n;i++){ 16 scanf("%d%d",&x,&y); 17 if(ans[x][0]) 18 add(ans[x][0],i),ans[x][0]=0; 19 else ans[x][0]=i; 20 if(ans[y][1]) 21 add(ans[y][1],i),ans[y][1]=0; 22 else ans[y][1]=i; 23 } for(int i=1;i<=n;i++){ 24 dfs(i,0); 25 if(vis[i]) putchar('r'); 26 else putchar('b'); 27 } return 0; 28 }