Submission #279729

#TimeUsernameProblemLanguageResultExecution timeMemory
279729nvmdavaDuathlon (APIO18_duathlon)C++17
0 / 100
184 ms32632 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];

int dfs(int v){
    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);
                }
            }
            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(n - 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;
    d[1] = 1;

    dfs(1);
    dfs2(1, 0);
    dfs3(1, 0);

    ans += 1LL * n * (n - 1) * (n - 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...