Submission #546810

#TimeUsernameProblemLanguageResultExecution timeMemory
546810MonarchuwuDuathlon (APIO18_duathlon)C++17
8 / 100
92 ms17484 KiB
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;

const int N = 1e5 + 9;
int n, m;
vector<int> g[N];

// bridge tree (WA for subtask 89)
namespace subtask34567 {
    int num[N], low[N], tme;
    int lab[N], cnt_scc, sz[N];
    int path[N], top;
    void tarjan(int u, int p) {
        num[u] = low[u] = ++tme;
        path[++top] = u;
        for (int v : g[u]) if (v != p) {
            if (num[v]) low[u] = min(low[u], num[v]);
            else {
                tarjan(v, u);
                low[u] = min(low[u], low[v]);
            }
        }

        if (num[u] == low[u]) { // chot
            num[u] = low[u] = N;
            lab[u] = ++cnt_scc;
            ++sz[cnt_scc];

            while (path[top] != u) {
                lab[path[top--]] = cnt_scc;
                ++sz[cnt_scc];
            }
            --top;
        }
    }
    vector<int> g2[N];
    void init_graph() {
        for (int u = 1; u <= n; ++u) for (int v : g[u])
            if (lab[u] != lab[v]) g2[lab[u]].push_back(lab[v]);
    }

    ll ans, dp[N][3];
    bool vis[N];
    void dfs(int u, int p) {
        vis[u] = true;

        dp[u][1] = sz[u];
        dp[u][2] = (ll)(sz[u] - 1) * (sz[u] - 1);
        ans += (ll)sz[u] * (sz[u] - 1) * (sz[u] - 2);

        for (int v : g2[u]) if (v != p) {
            dfs(v, u);
            dp[u][1] += dp[v][1];
            dp[u][2] += dp[v][2];
            dp[u][2] += dp[v][1] * sz[u];
            ans += dp[v][1] * (sz[u] - 1 + (ll)(sz[u] - 1) * (sz[u] - 2)) * 2;
            ans += dp[v][2] * sz[u] * 2;
        }
    }
    void solve() {
        for (int i = 1; i <= n; ++i)
            if (!num[i]) tarjan(i, 0);
        init_graph();

        for (int u = 1; u <= cnt_scc; ++u)
            if (!vis[u]) dfs(u, 0);
        cout << ans << '\n';
    }
}

bool f[N];
int main() {
    cin.tie(NULL)->sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 0, u, v; i < m; ++i) {
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    subtask34567::solve();
}
/**  /\_/\
 *  (= ._.)
 *  / >0  \>1
**/
#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...