?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
85471007 |
Practice: luogu_bot5 |
1140F - 11 | C++14 (GCC 6-32) | Accepted | 608 ms | 88068 KB | 2020-06-29 18:17:11 | 2020-06-29 18:17:11 |
#include<bits/stdc++.h> using namespace std; const int N=6e5+5; map<pair<int,int>,int> f; int x,y,n,l[N],r[N],fa[N],xs[N],ys[N]; stack<pair<int,int>> s; pair<int,int> e[N]; vector<pair<int,int>> v[N<<1]; long long ans; void update(int rt,int l,int r,int L,int R,pair<int,int> x) { if(L<=l && r<=R){v[rt].push_back(x);return;} int m=l+r>>1; if(L<=m)update(rt<<1,l,m,L,R,x); if(R>m)update(rt<<1|1,m+1,r,L,R,x); } int find(int x){return x==fa[x]?x:find(fa[x]);} void merge(int x,int y) { x=find(x),y=find(y); if(x==y)return; ans-=1ll*xs[x]*ys[x]+1ll*xs[y]*ys[y]; if(xs[x]+ys[x]>xs[y]+ys[y])swap(x,y); s.push(make_pair(x,y)); fa[x]=y,xs[y]+=xs[x],ys[y]+=ys[x]; ans+=1ll*xs[y]*ys[y]; } void del(int x,int y) { ans-=1ll*xs[y]*ys[y]; fa[x]=x,xs[y]-=xs[x],ys[y]-=ys[x]; ans+=1ll*xs[x]*ys[x]+1ll*xs[y]*ys[y]; } void query(int rt,int l,int r) { int sum=s.size(); for(auto u:v[rt])merge(u.first,u.second); if(l==r)printf("%lld ",ans); else { int m=l+r>>1; query(rt<<1,l,m); query(rt<<1|1,m+1,r); } while(s.size()>sum)del(s.top().first,s.top().second),s.pop(); } int main() { scanf("%d",&n); for(int i=1;i<=600000;i++)fa[i]=i,xs[i]=(i<=n),ys[i]=!xs[i]; for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); y+=300000; if(f[make_pair(x,y)]==0) f[make_pair(x,y)]=i,l[i]=i,r[i]=-1,e[i]=make_pair(x,y); else r[f[make_pair(x,y)]]=i-1,f[make_pair(x,y)]=0; } for(int i=1;i<=n;i++) if(l[i] && r[i]==-1)r[i]=n; for(int i=1;i<=n;i++) if(l[i])update(1,1,n,l[i],r[i],e[i]); query(1,1,n); }
?
?
?
?