제출 #279769

#제출 시각아이디문제언어결과실행 시간메모리
279769nvmdavaDuathlon (APIO18_duathlon)C++17
100 / 100
172 ms32760 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 200005;
const ll MOD = 1000000007;
const int INF = 0x3f3f3f3f;

vector<int> adj[N];

int d[N], n;
bool sep[N];
bool vis[N];
int s = 0;

int dfs(int v){
    vis[v] = 1;
    ++s;
    int t = N;
    for(auto& x : adj[v]){
        if(d[x] == d[v] - 1)
            continue;
        if(d[x] == -1){
            d[x] = d[v] + 1;
            int a = dfs(x);
            if(a >= d[v])
                sep[x] = 1;
            t = min(t, a);
        } else
            t = min(t, d[x]);
    }

    return t;
}

int sz[N];
int cnt = 0;

vector<int> adj2[N];
void dfs2(int v, int c){
    ++sz[c];
    bool did = 0;
    int nv = 0;
    for(auto& x : adj[v]){
        if(d[x] != d[v] + 1) continue;
        if(sep[x]){
            if(did == 0){
                nv = ++cnt;
                did = 1;
                if(d[v] != 1){
                    adj2[c].push_back(nv);
                    adj2[nv].push_back(c);
                }
            }
            ++cnt;
            adj2[nv].push_back(cnt);
            adj2[cnt].push_back(nv);
            sz[cnt] = 1;
            dfs2(x, cnt);
        } else {
            dfs2(x, c);
        }
    }
}

ll ans = 0;
int szz[N];
void dfs3(int v, int p){
    vector<int> a;
    for(auto& x : adj2[v]){
        if(x == p) continue;
        dfs3(x, v);
        szz[v] += szz[x] - 1;
        a.push_back(szz[x] - 1);
    }

    szz[v] += max(1, sz[v]);

    a.push_back(s - szz[v]);

    if(sz[v]){
        for(auto& x : a){
            ans -= 1LL * (sz[v] - 1) * x * (x + 1);
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int m;
    cin>>n>>m;

    while(m--){
        int v, u;
        cin>>v>>u;
        adj[v].push_back(u);
        adj[u].push_back(v);
    }


    for(int i = 1; i <= n; ++i)
        d[i] = -1;
    for(int i = 1; i <= n; ++i){
        if(!vis[i]){
            for(; cnt > 0; --cnt){
                sz[cnt] = szz[cnt] = 0;
                adj2[cnt].clear();
            }
            s = 0;
            d[i] = 1;
            dfs(i);
            dfs2(i, 0);
            dfs3(1, 0);
            ans += 1LL * s * (s - 1) * (s - 2);
        }
    }

    cout<<ans;
}
#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...