Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33875 liuyile 【BJ】T2 C++ 通过 100 692 MS 102196 KB 4903 2024-10-24 19:08:20

Tests(13/13):


#include<bits/stdc++.h> using namespace std; // #define int long long // #define endl "\n" int lst=0; vector<int>g[200300]; int hd[200300]; struct edge{int v,id,nxt;}E[2400030]; int ec=0; inline void add(int u,int v,int id){ ++ec; E[ec]={v,id,hd[u]}; hd[u]=ec; swap(u,v); // cout<<u<<" "<<v<<" "<<id<<endl; ++ec; E[ec]={v,id,hd[u]}; hd[u]=ec; } map<int,int>mp[200300],vis[200300]; map<int,int>loc[200300]; int n,q; int f[1200300]; inline int ff(int x){return f[x]==x?x:f[x]=ff(f[x]);} inline bool merge(int x,int y){ x=ff(x),y=ff(y); if(x==y)return 0; f[ff(x)]=ff(y); return 1; } int m=0; int U[1200300],V[1200300]; int ct=0; int mk[1200300]; int bel[1200300]; bool ban[1200300]; bool vs[1200300]; inline int nxt(int x){ while(E[x].nxt!=-1&&ban[E[E[x].nxt].id])E[x].nxt=E[E[x].nxt].nxt; return E[x].nxt; } int sm=1; inline void upd(int x){ // cout<<"!"<<x<<endl; while(hd[x]!=-1&&ban[E[hd[x]].id]){ // if(x==5)cout<<E[hd[x]].v<<"!55 "; hd[x]=E[hd[x]].nxt; } // if(x==5)cout<<endl; // cout<<"."<<x<<endl; } inline void sp(int x,int y){ int id=mp[x][y]; vector<int>X,Y; X.push_back(x); Y.push_back(y); vs[x]=vs[y]=1; int itx=0; int ity=0; upd(x),upd(y); int ex=hd[x],ey=hd[y]; bool p=0; vector<int>OP; // cout<<x<<" "<<y<<" "<<ex<<" "<<ey<<endl; while(itx!=X.size()&&ity!=Y.size()){ if(p==0){ while(ex==-1){ itx++; if(itx==X.size())break; upd(X[itx]); ex=hd[X[itx]]; } if(itx==X.size()){OP=X;break;} int v=E[ex].v; // cout<<X[itx]<<"x"<<v<<endl; if(!vs[v]){X.push_back(v);vs[v]=1;}; ex=nxt(ex); } else { while(ey==-1){ ity++; if(ity==Y.size())break; upd(Y[ity]); ey=hd[Y[ity]]; // cout<<hd[5]<<"?5"<<endl; // cout<<ity<<"y"<<Y[ity]<<" "<<ey<<endl; } if(ity==Y.size()){OP=Y;break;} int v=E[ey].v; // cout<<Y[ity]<<"y"<<v<<endl; if(!vs[v]){Y.push_back(v);vs[v]=1;}; ey=nxt(ey); } p^=1; } // for(int x:X) // cout<<x<<" "; // cout<<endl; // for(int y:Y) // cout<<y<<" "; // cout<<endl; // cout<<itx<<" "<<ity<<endl; for(int x:X) vs[x]=0; for(int y:Y) vs[y]=0; ++sm; for(int x:OP) bel[x]=sm; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("planar.in","r",stdin); // freopen("planar.out","w",stdout); cin>>n>>q; memset(hd,-1,sizeof(hd)); if(n==1){ while(q--){cout<<1<<"\n";} cout.flush(); return 0; } for(int i=1;i<=n;i++){ int k; cin>>k; while(k--){ int x; cin>>x; g[i].push_back(x); if(!mp[x][i]) mp[x][i]=mp[i][x]=++m,add(i,x,m); loc[i][x]=g[i].size()-1; } g[i].push_back(g[i][0]); } for(int u=1;u<=n;u++){ int k=g[u].size()-1; for(int i=0;i<k;i++){ int v=g[u][i]; int id=mp[u][v]; if(vis[u][v])continue; int x=u; ++ct; int st=id; while(1){ int id=mp[x][v]; vis[x][v]=1; if(mk[id])U[id]=ct,V[id]=mk[id]; else mk[id]=ct; int p=loc[v][x]; x=v; v=g[v][p+1]; if(mp[x][v]==st&&x==u)break; } } } for(int i=1;i<=ct;i++)f[i]=i; for(int i=1;i<=n;i++)bel[i]=1; int s=1; while(q--){ char op; cin>>op; int x,y; cin>>x>>y; x^=lst,y^=lst; // cout<<x<<" "<<y<<" "; if(op=='-'){ int ox=x,oy=y; int p=mp[x][y]; x=U[p],y=V[p]; ban[p]=1; // cout<<x<<" "<<y<<" "<<ff(x)<<" "<<ff(y)<<endl; if(!merge(x,y)){ // cout<<"?????"<<endl; sp(ox,oy); // for(int i=1;i<=n;i++) // cout<<bel[i]<<" "; // cout<<endl; s++; } lst=s; } else lst=(bel[x]==bel[y]); cout<<lst<<"\n"; } cout.flush(); return 0; } /* 9 8 2 2 4 3 1 3 5 2 6 2 3 1 5 7 4 2 6 8 4 3 3 9 5 2 4 8 3 5 9 7 2 6 8 - 1 4 - 2 5 - 3 6 ? 1 9 - 5 6 - 8 9 ? 6 9 ? 7 9 !atention:no qiang zhi zai xian. */


测评信息: