NC217953. Alice,BobandPlayGame
描述
输入描述
第一行两个整数。
接下来行每行两个整数。
输出描述
第一行个整数。第二行一个长度为的串,表示第轮游戏进行的操作。有多种合法的操作序列只需要输出任意一种即可。
示例1
输入:
6 5 1 2 3 4 2 3 2 5 1 6
输出:
5 4 4 4 4 00100
C++ 解法, 执行用时: 153ms, 内存消耗: 17140K, 提交时间: 2021-06-06 20:55:55
#include<bits/stdc++.h> #define R int #define I inline #define ll long long using namespace std; const int N=2e5+3; int to[N],p[N],ln[N],res[N]; vector<int>f[N<<1]; void work(int u) { res[u>>1]=u&1; for(auto v:f[u])work(v); } void add(int x,int y){to[x]=y;to[y]=x;} void link(int x,int y){f[x].push_back(y);} int main() { int n,m,c; scanf("%d%d",&n,&m);c=n; for(R i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); if(!to[u]&&!to[v]) { --c; add(u,v); ln[u]=i<<1|1;ln[v]=i<<1; } else { if(to[u]&&to[v]) { if(to[u]==v)work(ln[u]); else { int x=to[u],y=to[v]; link(ln[x],ln[v]); link(ln[y],ln[u]); add(u,v);add(x,y); } } else { int w=to[u]|to[v]; work(ln[w]); to[w]=0; add(u,v); } ln[u]=i<<1;ln[v]=i<<1|1; } printf("%d ",c); } puts(""); for(R i=1;i<=n;i++) if(to[i])work(ln[i]),to[to[i]]=0; for(R i=1;i<=m;i++)printf("%d",res[i]); return 0; }