Submission #536467

#TimeUsernameProblemLanguageResultExecution timeMemory
536467nicholaskDuathlon (APIO18_duathlon)C++14
31 / 100
201 ms27640 KiB
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define pb push_back
using namespace std;
using pii=pair <int,int>;
int n,m;
vector <int> g[100010],bc[200020];
bool visited[200010];
int tme,dfn[200020],low[200020],curid;
stack <int> st;
int weigh[200020];
void dfs(int cur){
    tme++;
    dfn[cur]=tme; low[cur]=tme;
    st.push(cur);
    visited[cur]=1;
    for (int i:g[cur]){
        if (!visited[i]){
            dfs(i);
            low[cur]=min(low[cur],low[i]);
            if (low[i]==dfn[cur]){
                curid++;
                while (st.top()!=cur){
                    bc[st.top()].pb(curid);
                    bc[curid].pb(st.top());
                    st.pop();
                    weigh[curid]++;
                }
                bc[cur].pb(curid);
                bc[curid].pb(cur);
                weigh[curid]++;
            }
        } else low[cur]=min(low[cur],dfn[i]);
    }
}
int ans,rtsz;
int siz[200020];
void dfs2(int cur,int prv){
    siz[cur]=(cur<=n);
    for (int i:bc[cur]){
        if (i==prv) continue;
        dfs2(i,cur);
        siz[cur]+=siz[i];
    }
    if (prv==-1) rtsz=siz[cur];
}
void dfs3(int cur,int prv){
    if (cur<=n){
        int ww=(rtsz-1)*(rtsz-1),sum=0;
        for (int i:bc[cur]){
            if (i==prv) continue;
            ww-=siz[i]*siz[i];
            sum+=siz[i];
        }
        ww-=(rtsz-sum-1)*(rtsz-sum-1);
        ww/=2;
        ww+=(rtsz-1);
        ans-=max(0ll,ww);
    } else {
        int ww=rtsz*rtsz,sum=0;
        for (int i:bc[cur]){
            if (i==prv) continue;
            ww-=siz[i]*siz[i];
            sum+=siz[i];
        }
        ww-=(rtsz-sum)*(rtsz-sum);
        ww/=2;
        ans+=max(0ll,ww)*weigh[cur];
    }
    for (int i:bc[cur]){
        if (i==prv) continue;
        dfs3(i,cur);
    }
}
signed main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin>>n>>m;
    while (m--){
        int u,v;
        cin>>u>>v;
        g[u].pb(v);
        g[v].pb(u);
    }
    curid=n;
    for (int i=1; i<=n; i++){
        if (visited[i]) continue;
        dfs(i);
        while (!st.empty()) st.pop();
        dfs2(i,-1);
        dfs3(i,-1);
    }
    cout<<2*ans<<'\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...