Submission #1351774

#TimeUsernameProblemLanguageResultExecution timeMemory
1351774nguyenkhangninh99Duathlon (APIO18_duathlon)C++20
100 / 100
71 ms32752 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 4e5 + 5;
vector<int> adj[maxn];
int num[maxn], low[maxn], timedfs = 0;
stack<int> st;

vector<int> bct[maxn];
int sz[maxn], w[maxn], id;

void tarjan(int u, int p){
    num[u] = low[u] = ++timedfs;
    st.push(u);

    for(int v: adj[u]){
        if(v == p) continue; 
        if(!num[v]){
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
            
            if(low[v] >= num[u]){
                id++;
                while(true){
                    int x = st.top(); st.pop();
                    bct[id].push_back(x);
                    bct[x].push_back(id);
                    w[id]++;
                    if(x == v) break;
                }
                bct[id].push_back(u);
                bct[u].push_back(id);
                w[id]++;
            }
        } else low[u] = min(low[u], num[v]);
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m; cin >> n >> m;

    for(int i = 1; i <= m; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    id = n;
    int cnt = 0, ans = 0;
    function<void(int, int)> dfs = [&](int u, int p){
        sz[u] = (u <= n); 
        cnt += sz[u];
        
        for(int v: bct[u]){
            if(v == p) continue;
            dfs(v, u);
            sz[u] += sz[v];
        }
    };
    function<void(int, int)> calc = [&](int u, int p){
        int cur = cnt * (cnt - 1) - (cnt - sz[u]) * (cnt - sz[u] - 1);

        for(int v : bct[u]){
            if(v == p) continue;
            cur -= sz[v] * (sz[v] - 1);
            calc(v, u);
        }
        ans += cur * (u <= n ? -1 : w[u]);
    };
    for(int i = 1; i <= n; i++){
        if(!num[i]){
            cnt = 0;
            tarjan(i, 0);
            dfs(i, 0);
            calc(i, 0);
        }
    }
    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...