제출 #1348449

#제출 시각아이디문제언어결과실행 시간메모리
1348449warrenn조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++20
100 / 100
1012 ms65948 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")
const int maxn=1e5;
int n,m;
set<int>adj[maxn+2],rev[maxn+2],cc[maxn+2];
int dsu[maxn+2],sz[maxn+2];

int fin(int a){
    if(dsu[a]==a)return a;
    return dsu[a]=fin(dsu[a]);
}

queue<ii>qu;
void cek(int a,int b){
    adj[a].insert(b);
    rev[b].insert(a);

    if(adj[b].count(a))qu.push({a,b});
}

int ans=0;
void merg(int a,int b){
    a=fin(a),b=fin(b);
    if(a==b)return;
    int tota=cc[a].size()+adj[a].size()+rev[a].size();
    int totb=cc[b].size()+adj[b].size()+rev[b].size();

    if(tota>totb)swap(a,b); 
    ans+=sz[a]*cc[b].size()+sz[b]*cc[a].size();

    dsu[a]=b,sz[b]+=sz[a];
    for(auto x : cc[a]){
        if(cc[b].count(x))ans-=sz[b];
        else cc[b].insert(x);
    }

    adj[a].erase(b), adj[b].erase(a);
    rev[a].erase(b), rev[b].erase(a);
    for(auto x : adj[a]){
        rev[x].erase(a);
        cek(b,x);
    }

    for(auto x : rev[a]){
        //if(a==2)cout<<x<<endl;
        adj[x].erase(a);
        cek(x,b);
    }
    adj[a].clear(),rev[a].clear();
}

signed main(){
    cin>>n>>m;
    for(int q=1;q<=n;q++){
        dsu[q]=q,sz[q]=1;
        cc[q].insert(q);
    }

    while(m--){
        int a,b;cin>>a>>b;
        if(fin(a)!=fin(b) && !cc[fin(b)].count(a)){
            int apa=fin(b);
            cc[apa].insert(a);
            ans+=sz[apa];

            cek(fin(a),apa);
          //  if(a==2 && b==1)cout<<fin(a)<<' '<<apa<<endl;
            while(qu.size()){
                auto [u,v]=qu.front();
                merg(fin(u),fin(v));
                qu.pop();
            }
        }

        cout<<ans<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...