Submission #1245535

#TimeUsernameProblemLanguageResultExecution timeMemory
1245535Born_To_LaughDuathlon (APIO18_duathlon)C++17
100 / 100
65 ms31164 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(Lotus) Lotus.begin(), Lotus.end()
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e9 + 7;
#define int ll
const int maxn = 2e5 + 10;
int tin[maxn], low[maxn], sz[maxn];
vector<int> adj[maxn], bcadj[maxn], st;
int id = 0, cc = 0;
int ccsz = 0;
int ans = 0;
int n, m;
void dfs(int a, int par){
    tin[a] = low[a] = ++id;
    ccsz++;
    st.push_back(a);
    for(auto &elm: adj[a]){
        if(elm == par)continue;
        if(tin[elm]){
            low[a] = min(low[a], tin[elm]);
            continue;
        }
        dfs(elm, a);
        low[a] = min(low[a], low[elm]);

        if(low[elm] >= tin[a]){
            cc++;
            bcadj[a].push_back(cc);
            bcadj[cc].push_back(a);
            // cout << cc << '\n';
            while(bcadj[cc].empty() || bcadj[cc].back() != elm){
                bcadj[cc].push_back(st.back());
                bcadj[st.back()].push_back(cc);
                st.pop_back();
            }
        }
    }
}
void bctree(int a, int par){
    sz[a] = (a <= n);
    for(auto &elm: bcadj[a]){
        if(elm == par)continue;
        bctree(elm, a);
        sz[a] += sz[elm];
        if(a > n){
            //a = bcc
            ans -= (bcadj[a].size() - 1) * sz[elm] * (sz[elm] - 1);
        }
    }
    if(a > n){
        int num = ccsz - sz[a];
        ans -= num * (num - 1) * (bcadj[a].size() - 1);
    }
}
void solve(){
    cin >> n >> m;
    cc = n;
    for(int i=1; i<=m; ++i){
        int a, b;cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for(int i=1; i<=n; ++i){
        if(!tin[i]){
            ccsz = 0;
            dfs(i, -1);
            ans += ccsz * (ccsz - 1) * (ccsz - 2);
            bctree(i, -1);
        }
    }
    cout << ans << '\n';
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#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...