?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
177871059 |
Practice: grass8sheep |
1140F - 11 | C++14 (GCC 6-32) | Accepted | 686 ms | 83192 KB | 2022-10-25 15:17:49 | 2022-10-25 15:17:49 |
// LUOGU_RID: 91517076 #include<bits/stdc++.h> #define ll long long using namespace std; const int n=3e5; int f[601000],s1[601000],s2[601000]; int top,U[600010],V[601000]; int q; map<int,int>kp[301000]; struct ed{int u,v;}; vector<ed>g[1210000]; void up(int p,int l,int r,int x,int y,ed z){ if(x<=l&&r<=y){ g[p].push_back(z); return; } if(y<l||x>r)return; int mid=(l+r)>>1; up(p<<1,l,mid,x,y,z),up(p<<1|1,mid+1,r,x,y,z); } int F(int x){ if(x==f[x])return x; return F(f[x]); } ll now; void merge(int u,int v){ u=F(u),v=F(v); if(u==v)return; now-=1ll*s1[u]*s2[u]; now-=1ll*s1[v]*s2[v]; if(s1[u]+s2[u]<s1[v]+s2[v])swap(u,v); s1[u]+=s1[v],s2[u]+=s2[v],f[v]=u; now+=1ll*s1[u]*s2[u]; top++,U[top]=u,V[top]=v; } void sol(int p,int l,int r){ int ntop=top; ll tnow=now; for(ed t:g[p])merge(t.u,t.v+n); if(l==r)printf("%lld ",now); else{ int mid=(l+r)>>1; sol(p<<1,l,mid),sol(p<<1|1,mid+1,r); } now=tnow; while(top>ntop){ f[V[top]]=V[top]; s1[U[top]]-=s1[V[top]],s2[U[top]]-=s2[V[top]]; top--; } } int main(){ scanf("%d",&q); for(int i=1;i<=2*n;i++)f[i]=i,s1[i]=(i<=n),s2[i]=(i>n); for(int i=1,x,y;i<=q;i++){ scanf("%d%d",&x,&y); if(kp[x][y])up(1,1,q,kp[x][y],i-1,(ed){x,y}),kp[x][y]=0; else kp[x][y]=i; } for(int i=1;i<=n;i++)for(pair<int,int> id:kp[i]){ int u=id.first,v=id.second; if(v)up(1,1,q,v,q,(ed){i,u}); } sol(1,1,q); return 0; }
?
?
?
?