Submission #737041

#TimeUsernameProblemLanguageResultExecution timeMemory
737041onlk97철인 이종 경기 (APIO18_duathlon)C++14
0 / 100
170 ms32984 KiB
#include <bits/stdc++.h>
using namespace std;
long long n,m;
vector <int> g[100010],bc[200010];
bool visited[200010];
long long dfn[100010],lo[100010],w[200020],sz[200020],occ[200020];
stack <int> st;
int tme,curid;
void dfs(int cur){
    tme++;
    dfn[cur]=lo[cur]=tme;
    visited[cur]=1;
    st.push(cur);
    for (int i:g[cur]){
        if (!visited[i]){
            dfs(i);
            lo[cur]=min(lo[cur],lo[i]);
            if (lo[i]==dfn[cur]){
                curid++;
                bool ok=1;
                while (ok){
                    bc[st.top()].push_back(curid);
                    bc[curid].push_back(st.top());
                    w[curid]++;
                    if (st.top()==i) ok=0;
                    st.pop();
                }
                bc[cur].push_back(curid);
                bc[curid].push_back(cur);
                w[curid]++;
            }
        } else lo[cur]=min(lo[cur],dfn[i]);
    }
}
void dfs2(int cur,int prv){
    visited[cur]=1;
    sz[cur]=(cur<=n);
    long long rem=n-(cur<=n);
    occ[cur]=n*(n-1)/2;
    for (int i:bc[cur]){
        if (i==prv) continue;
        dfs2(i,cur);
        sz[cur]+=sz[i];
        occ[cur]-=sz[i]*(sz[i]-1)/2;
        rem-=sz[i];
    }
    occ[cur]-=rem*(rem-1)/2;
}
signed main(){
    cin>>n>>m;
    for (int i=0; i<m; i++){
        int u,v; cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    curid=n;
    for (int i=1; i<=n; i++){
        if (!visited[i]) dfs(i);
    }
    for (int i=1; i<=curid; i++) visited[i]=0;
    for (int i=1; i<=n; i++) w[i]=-1;
    for (int i=1; i<=curid; i++){
        if (!visited[i]) dfs2(i,0);
    }
    long long ans=0;
    for (int i=1; i<=curid; i++) ans+=w[i]*occ[i];
    cout<<ans*2<<'\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...