Submission #1335577

#TimeUsernameProblemLanguageResultExecution timeMemory
1335577NewtonabcMaking Friends on Joitter is Fun (JOI20_joitter2)C++20
0 / 100
6 ms9796 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int pa[N];
map<int,int> in[N],out[N];
ll ans=0,sz[N];
int root(int x){if(pa[x]==x) return x; return pa[x]=root(pa[x]);}
ll allp(ll x){return (x*(x-1LL));}
void merge(int u,int v){
    int ru=root(u),rv=root(v);
    ans-=allp(sz[ru])+allp(sz[rv]);
    //cout<<ans <<" ";
    int szu=in[u].size()+out[u].size();
    int szv=in[v].size()+out[v].size();
    if(szu<szv) swap(szu,szv),swap(u,v),swap(ru,rv);
    ll un=in[u].size();
    //cout<<"root" <<ru <<" " <<rv <<" ";
    for(auto [x,st]:in[rv]){
        if(root(x)==rv) continue;
        if(root(x)==ru){
            ans-=sz[rv];
            continue;
        }
        if(in[ru][x]) un--;
        if(!in[ru][x]) ans+=sz[ru];
        in[ru][x]=1;
    }
    //cout<<ans <<" ";
    ans+=un*sz[rv];
    //cout<<ans <<" ";
    for(auto [x,st]:out[rv]){
        if(root(x)==rv) continue;
        if(root(x)==ru){
            ans-=sz[ru];
            continue;
        }
        out[ru][x]=1;
    }
    //cout<<ans <<" ";
    sz[ru]+=sz[rv];
    ans+=allp(sz[ru]);
    pa[rv]=ru;
}
int main(){
    int n,m; cin>>n >>m;
    for(int i=1;i<=n;i++) pa[i]=i,sz[i]=1;
    for(int i=0;i<m;i++){
        int u,v; cin>>u >>v;
        if(root(u)==root(v)){
            cout<<ans <<"\n";
            continue;
        }
        int ru=root(u),rv=root(v);
        if(in[rv][ru]){
            cout<<ans <<"\n";
            continue;
        }
        if(out[rv][ru]){
            merge(u,v);
        }
        else{
            if(out[ru][rv]){
                cout<<ans <<"\n";
                continue;
            }
            out[ru][rv]=1;
            in[rv][ru]=1;
            ans+=sz[rv];
        }
        cout<<ans <<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...