Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33868 | LYLAKIOI | 【BJ】T2 | C++ | 运行出错 | 23 | 709 MS | 92152 KB | 3538 | 2024-10-24 16:47:02 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define p_b push_back #define m_p make_pair using namespace std; typedef long long ll; const int maxn=1e6+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } inline char gc(){ char ch=getchar(); while(ch!='-'&&ch!='?')ch=getchar(); return ch; } int n,m,res,ndct,bel[maxn],vis[maxn],hd[maxn],belct; struct Dsu { int fa[maxn]; int fd(int u){ if(u==fa[u])return u; return fa[u]=fd(fa[u]); } void init(int n){ up(i,1,n)fa[i]=i; } }dsu; vector<pi>v[maxn]; map<pi,int>pos; map<pi,int>ID; map<pi,int>nxt; struct nd { int x,y,bel,del; }d[maxn<<1]; void fc(){ up(i,1,n)up(j,0,int(v[i].size())-1)pos[m_p(i,v[i][j].p1)]=j; for(int i=2;i<=2*m+1;i++)if(!d[i].bel){ d[i].bel=++ndct; int u=d[i].y,lst=d[i].x; int cc=0; while(u!=d[i].x){ int p=pos[m_p(u,lst)]; auto it=((p==v[u].size()-1)?v[u][0]:v[u][p+1]); d[it.p2].bel=ndct; lst=u,u=it.p1; } }dsu.init(ndct); } void sp(int x,int y){ queue<pi>q1,q2; int p=pos[m_p(x,y)]; nxt[m_p(x,p-1)]=nxt[m_p(x,p)]; p=pos[m_p(y,x)]; nxt[m_p(y,p-1)]=nxt[m_p(x,p)]; q1.push(m_p(x,nxt[m_p(x,-1)])),q2.push(m_p(y,nxt[m_p(y,-1)])); set<pi>S1,S2; S1.insert(m_p(x,nxt[m_p(x,-1)])); S2.insert(m_p(y,nxt[m_p(y,-1)])); while(q1.size()&&q2.size()){ auto it1=q1.front(),it2=q2.front();q1.pop(),q2.pop(); auto expand=[](int x,int y){ int ty=y; y=nxt[m_p(x,y)]; if(y<v[x].size())return m_p(x,y); y=v[x][ty].p1; return m_p(y,nxt[m_p(y,-1)]); }; auto f1=expand(it1.p1,it1.p2),f2=expand(it2.p1,it2.p2); if(!S1.count(f1))S1.insert(f1),q1.push(f1); if(!S2.count(f2))S2.insert(f1),q2.push(f2); } if(q1.empty()){++belct; for(auto it:S1){ bel[it.p1]=belct; bel[v[it.p1][it.p2].p1]=belct; } }else {++belct; for(auto it:S2){ bel[it.p1]=belct; bel[v[it.p1][it.p2].p1]=belct; } } } void slv(){ n=read();int q=read(); up(i,1,n){ int k=read(); while(k--){ int x=read(); if(ID.count(m_p(i,x))){ v[i].p_b(m_p(x,ID[m_p(i,x)])); continue; } ++m; d[m*2].x=i,d[m*2].y=x;ID[m_p(i,x)]=m*2; d[m*2+1].x=x,d[m*2+1].y=i;ID[m_p(x,i)]=m*2+1; v[i].p_b(m_p(x,ID[m_p(i,x)])); } }fc(); int res=1,lst=0; while(q--){ char op=gc(); int x=read()^lst,y=read()^lst; if(op=='?'){ lst=(bel[x]==bel[y]); printf("%d\n",lst); continue; } int id=ID[m_p(x,y)]; int a=d[id].bel,b=d[id^1].bel; if(dsu.fd(a)==dsu.fd(b))res++,sp(x,y); dsu.fa[dsu.fd(a)]=dsu.fd(b); lst=res;printf("%d\n",res); } } int main(){ //freopen("planar.in","r",stdin); //freopen("planar.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }