제출 #1059614

#제출 시각아이디문제언어결과실행 시간메모리
1059614vjudge1철인 이종 경기 (APIO18_duathlon)C++17
90 / 100
112 ms44632 KiB
#include<bits/stdc++.h>
using namespace std;
struct DDS{
    int par[1<<18];
    int abp(int n){
        return par[n]?par[n]=abp(par[n]):n;
    }
    void merge(int a,int b){
        a=abp(a),b=abp(b);
        if(a-b)par[a]=b;
    }
} dsu;
vector<int>adj[1<<17],adj2[1<<18];
set<pair<int,int>>st[1<<17];
long long par[1<<17],dep[1<<17],cycpar[1<<17],CC,N,N2,sz[1<<17];
void dfsC(int n,int p){
    N++;
    dep[n]=dep[p]+1;
    par[n]=p;
    for(auto i:adj[n]){
        if(i==p)continue;
        if(!dep[i])
            dfsC(i,n);
        else if(dep[i]<dep[n])
            st[n].insert({dep[i],++CC});
    }
}
void dfsM(int n,int p){
    for(auto i:adj[n]) {
        if(par[i]-n)continue;
        dfsM(i,n);
        if(st[i].empty())continue;
        if(st[i].begin()->first<dep[n]) {
            if(st[n].size())
                dsu.merge(st[i].begin()->second,st[n].begin()->second);
            st[n].insert(*st[i].begin());
        } else adj2[n].push_back(dsu.abp(st[i].begin()->second));
    }
    if(st[n].size())
        cycpar[n]=st[n].begin()->second;
    else adj2[p].push_back(n);
}
void dfsP(int n,int p){
    for(auto i:adj[n])
        if(par[i]==n)
            dfsP(i,n);
    if(cycpar[n])
        adj2[dsu.abp(cycpar[n])].push_back(n);
}
long long TOT;
void dfsA(int n){
    sz[n]=n<=N2;
    long long k=(N-sz[n])*(N-sz[n]);
    for(auto i:adj2[n])dfsA(i),
        sz[n]+=sz[i],k-=sz[i]*sz[i];
    k-=(N-sz[n])*(N-sz[n]);
    if(n>N2)k*=adj2[n].size()-1;
    TOT+=k;
}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b;cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    CC=N2=n;
    for(int K=1;K<=n;K++) {
        if(dep[K])continue;
        N=0;
        dfsC(K,0);
        dfsM(K,0);
        dfsP(K,0);
        dfsA(K);
    }
    cout<<TOT<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...