CF547D Mike and Fish 歐拉回路
阿新 • • 發佈:2020-11-26
題意:
分析:
首先我們將題意轉化,把行和列當做點,而每一個棋子,則是行和列之間的一條邊,然後我們給邊進行定向,使得每一個點的入度和出度的差值的絕對值不超過一
相當於在有向圖上跑歐拉回路
程式碼:
#include<bits/stdc++.h> using namespace std; namespace zzc { inline int read() { int x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();} while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f; } const int maxn = 200000; int head[maxn*2+5],deg[maxn*2+5]; int n,cnt=1; bool vis[maxn*4+5],ans[maxn*2+5]; struct edge { int to,nxt; }e[maxn*4]; void add(int u,int v) { e[++cnt].to=v; e[cnt].nxt=head[u]; head[u]=cnt; deg[v]++; } void dfs(int u) { for(int &i=head[u],tmp;i;i=e[i].nxt) { if(!vis[tmp=(i>>1)]) { vis[tmp]=true; if(tmp<=n) ans[tmp]=i&1; else ans[tmp]=0; dfs(e[i].to); } } } void work() { int x,y; n=read(); for(int i=1;i<=n;i++) { x=read();y=read(); add(x,y+maxn);add(y+maxn,x); } for(int i=1;i<=(maxn<<1);i++) if(deg[i]&1) add(0,i),add(i,0); for(int i=1;i<=(maxn<<1);i++) dfs(i); for(int i=1;i<=n;i++) putchar(ans[i]?'b':'r'); } } int main() { zzc::work(); return 0; }