제출 #710666

#제출 시각아이디문제언어결과실행 시간메모리
710666StickfishDuathlon (APIO18_duathlon)C++17
0 / 100
1094 ms1048576 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
using ll = long long;

const int MAXN = 1e5 + 23;
vector<int> edg[MAXN];
int depth[MAXN];
int tin[MAXN];
int fup[MAXN];
int timer = 0;
bitset<MAXN> used;

vector<int> stck;
vector<int> comps[MAXN];
vector<int> cedg[MAXN];
int csz[MAXN];
int compcnt = 0;
int rcomps[MAXN];

void dfs(int v, int rt) {
    used[v] = 1;
    tin[v] = fup[v] = timer++;
    stck.push_back(v);
    for (auto u : edg[v]) {
        if (u == rt)
            continue;
        if (used[u]) {
            fup[v] = min(fup[v], tin[u]);
            continue;
        }
        dfs(u, v);
        fup[v] = min(fup[v], fup[u]);
        if (fup[u] > tin[v]) {
            while (stck.back() != v) {
                comps[compcnt].push_back(stck.back());
                rcomps[stck.back()] = compcnt;
                stck.pop_back();
            }
            ++compcnt;
        }
    }
}

void cdfs(int v, int rt) {
    csz[v] = comps[v].size();
    for (auto u : cedg[v]) {
        if (u == rt)
            continue;
        cdfs(u, v);
        csz[v] += csz[u];
    }
}

signed main() {
    int n, m; 
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        edg[u].push_back(v);
        edg[v].push_back(u);
    }
    dfs(0, 0);
    while (stck.size()) {
        comps[compcnt].push_back(stck.back());
        rcomps[stck.back()] = compcnt;
        stck.pop_back();
    }
    ++compcnt;
    for (int v = 0; v < n; ++v) {
        for (auto u : edg[v]) {
            if (rcomps[v] != rcomps[u])
                cedg[rcomps[v]].push_back(rcomps[u]);
        }
    }
    cdfs(0, 0);
    //cout << compcnt << endl;
    //for (int i = 0; i < compcnt; ++i)
        //cout << comps[i].size() << ' ';
    //cout << endl;
    //cout << endl;
    ll ans = 1ll * n * (n - 1) * (n - 2);
    for (int v = 0; v < compcnt; ++v) {
        for (auto u : cedg[v]) {
            if (csz[u] > csz[v])
                continue;
            //cout << comps[v].size() << ' ' << csz[u] << endl;
            ans -= 1ll * csz[u] * (csz[u] - 1) * comps[v].size();
            ans -= 2ll * csz[u] * (comps[v].size() - 1);
        }
        
        ans -= 1ll * (n - csz[v]) * (n - csz[v] - 1) * comps[v].size();
        ans -= 2ll * (n - csz[v]) * (comps[v].size() - 1);
        //cout << "!" << comps[v].size() << ' ' << n - csz[v] << endl;
    }
    cout << 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...