Submission #1249291

#TimeUsernameProblemLanguageResultExecution timeMemory
1249291ender_shayanMaking Friends on Joitter is Fun (JOI20_joitter2)C++20
0 / 100
8 ms16704 KiB
#include<bits/stdc++.h>
using namespace std;


typedef long long        ll;
typedef pair<int,int>    pii;
typedef pair<ll,ll>      pll;


#define F               first
#define S               second    
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define all(x)          x.begin(),x.end()
#define pb              push_back
#define Mp              make_pair
#define for1(n)         for(int i=1;i<=n;i++)
#define for0(n)         for(int i=0;i<n;i++)
#define set_dec(x)	    cout << fixed << setprecision(x);
#define endl            '\n'


const ll mod=1e9+7;

const int N=1e5+10,L=21,base=701;

int A[N],B[N],C[N],D[N],n,m,k,q,dp[N],par[N],sz[N],degin[N];
vector<int>g[N];
map<int,int>in[N],out[N],is[N];
ll ans;
int get_par(int v){
    if(par[v]==0)return v;
    return par[v]=get_par(par[v]);
}
void merg(int u,int v){
    u=get_par(u);
    v=get_par(v);
    if(u==v)return;
    if(sz[u]+in[u].size()+out[u].size()+is[u].size()>sz[v]+in[v].size()+out[v].size()+is[v].size())swap(u,v);
    par[u]=v;
    ans+=1ll*sz[v]*sz[u]*2;
    ans+=degin[v]*sz[u]+degin[u]*sz[v];
    degin[v]+=degin[u];
    out[v][u]=out[u][v]=in[v][u]=in[u][v]=0;
    vector<int>vec;
    for(pii p:out[u]){
        int uu=p.F,t=p.S;
        out[v][uu]+=t;
        in[uu][v]+=t;
        if(in[v][uu] && t)
            vec.pb(uu);
    }
    for(pii p:in[u]){
        int uu=p.F,t=p.S;
        in[v][uu]+=t;
        out[uu][v]+=t;
        if(out[v][uu] && t)
            vec.pb(uu);
    }
    for(int u:vec){
        ans-=out[v][u]*sz[u]+out[u][v]*sz[v];
        degin[v]-=out[u][v];
        degin[u]-=out[v][u];
        out[v][u]=out[u][v]=in[v][u]=in[u][v]=0;
    }
    sz[v]+=sz[u];
    for(pii p:is[u])is[v][p.F]++;
    out[u].clear();in[u].clear();is[u].clear();
    for(int u:vec)merg(u,v);
}
int main(){
    fast_io
    cin>>n>>m;
    for1(n)sz[i]=1;
    for(int _=0;_<m;_++,cout<<ans<<endl){
        int u,v;cin>>u>>v;
        int uu=u;
        u=get_par(u);v=get_par(v);
        if(u==v)continue;
        if(is[v][uu])continue;
        is[v][uu]=1;
        ans+=sz[v];
        out[u][v]++;
        in[v][u]++;degin[v]++;
        if(in[u][v]){
            ans-=1ll*out[u][v]*sz[v]+1ll*out[v][u]*sz[u];
            degin[v]-=out[u][v];
            degin[u]-=out[v][u];
            out[v][u]=out[u][v]=in[v][u]=in[u][v]=0;
            merg(u,v);
        }
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...