Submission #321282

# Submission time Handle Problem Language Result Execution time Memory
321282 2020-11-11T22:14:36 Z couplefire Duathlon (APIO18_duathlon) C++17
0 / 100
139 ms 37340 KB
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200015

int low[MAXN], tin[MAXN], curTime = 0, curComp = 0;
vector<int> tree[MAXN], children[MAXN];
bool isCut[MAXN];
vector<int> adj[MAXN];
bool visited[MAXN];
int n, m;
int nn = 0;
long long ans = 0;

void tarjan(int v, int p){
    visited[v] = 1;
    tin[v] = curTime++;
    low[v] = curTime-1;
    nn++;
    for(auto u : adj[v]){
        if(u == p) continue;
        if(visited[u]){
            low[v] = min(low[v], tin[u]);
        }
        else{
            children[v].push_back(u);
            tarjan(u, v);
            low[v] = min(low[v], low[u]);
            if(low[u] >= tin[v]){
                isCut[u] = 1;
            }
        }
    }
}

void ae(int a, int b){
    tree[a].push_back(b);
    tree[b].push_back(a);
}

void gen(int v, int b){
    if(b != 0) ae(v, b);
    for(auto u : children[v]){
        if(isCut[u]){
            curComp++;
            ae(v, curComp);
            gen(u, curComp);
        }
        else{
            gen(u, b);
        }
    }
}

int getSiz(int v, int p){
    if(v < n){
        int aa = 0;
        for(auto u : tree[v]){
            if(u == p) continue;
            aa += getSiz(u, v);
        }
        return aa;
    }
    int bb = tree[v].size();
    int aa = 0;
    for(auto u : tree[v]){
        if(u == p) continue;
        if(tree[u].size() == 1) continue;
        aa += getSiz(u, v);
        bb--;
    }
    ans -= 1ll*bb*aa*(aa-1);
    ans += 1ll*bb*(tree[v].size()-bb)*(tree[v].size()-bb-1);
    if(bb+aa != n){
        ans -= 1ll*(tree[v].size()-1)*(n-bb-aa+1)*(n-bb-aa);
    }
    return bb+aa;
}

int main(){
    // freopen("a.in", "r", stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for(int i = 0; i<m; i++){
        int a, b; cin >> a >> b;
        --a; --b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    curComp = n-1;
    for(int i = 0; i<n; i++) if(!visited[i]) {
        nn = 0;
        tarjan(i, -1);
        ans += 1ll*nn*(nn-1)*(nn-2);
        gen(i, 0);
        getSiz(i, -1);
    }
    // for(int i = 0; i<n; i++) if(isCut[i]) cout << i+1 << endl;
    // for(int i = 0; i<MAXN; i++){
    //     if(tree[i].size()){
    //         cout << i+1 << endl;
    //         for(auto j : tree[i]) cout << j+1 << " ";
    //         cout << endl << endl;;
    //     }
    // }
    cout << ans << endl;
}
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 14444 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 14444 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 126 ms 37340 KB Output is correct
2 Correct 125 ms 37340 KB Output is correct
3 Incorrect 139 ms 34272 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 11 ms 14720 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 135 ms 27864 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 11 ms 14572 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 128 ms 27844 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 14444 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 14444 KB Output isn't correct
2 Halted 0 ms 0 KB -