Submission #757256

# Submission time Handle Problem Language Result Execution time Memory
757256 2023-06-12T21:38:01 Z shjgkwo Duathlon (APIO18_duathlon) C++17
0 / 100
184 ms 53572 KB
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>

using namespace std;

const int MAXN = 100010;

vector<int> edge[MAXN];

map<int, int> bcce[MAXN];

int bcc_cnt = 0;

int pre_cnt = 0;
int pre[MAXN];
int low[MAXN];
int mypar[MAXN];
int is_sep[MAXN];

long long sum_perm_cnt = 0;
long long node_cnt[MAXN];
long long p[MAXN * 2];

set<int> bcc_node[MAXN * 2];

stack<pair<int, int> > st;

long long ans = 0;

inline const long long nP3(long long n) {
    return n * (n - 1) * (n - 2);
}

inline const long long nP2(long long n) {
    return n * (n - 1);
}

void dfs(int u, int par) {
    int child = 0, flag = 0;
    mypar[u] = par;
    node_cnt[u] = 1;
    low[u] = pre[u] = ++pre_cnt;
    for(auto &v: edge[u]) {
        if(v == par) continue;
        if(!pre[v]) {
            child++;
            st.push({u, v});
            dfs(v, u);
            node_cnt[u] += node_cnt[v];
            low[u] = min(low[u], low[v]);
            if(pre[u] <= low[v]) {
                bcc_cnt++;
                flag = 1;
                while(st.size() && (st.top().first != u || st.top().second != v)) {
                    int x = st.top().first;
                    int y = st.top().second;
                    bcc_node[bcc_cnt].insert(x);
                    bcc_node[bcc_cnt].insert(y);
                    bcce[x][y] = bcc_cnt;
                    bcce[y][x] = bcc_cnt;
                    st.pop();
                }
                if(st.size()) {
                    int x = st.top().first;
                    int y = st.top().second;
                    bcc_node[bcc_cnt].insert(x);
                    bcc_node[bcc_cnt].insert(y);
                    bcce[x][y] = bcc_cnt;
                    bcce[y][x] = bcc_cnt;
                    st.pop();
                }
                ans += nP3(bcc_node[bcc_cnt].size());
                p[bcc_cnt] = nP2(bcc_node[bcc_cnt].size() - 1);
            }
        }
        else if(pre[u] > pre[v]) {
            st.push({u, v});
            low[u] = min(low[u], pre[v]);
        }
    }
    if(child >= 2 && par == -1) is_sep[u] = 1;
    else if(flag && par != -1) is_sep[u] = 1;
}

int chk[MAXN];

void solve(int u, int par) {
    long long sum_node_cnt = node_cnt[1] - node_cnt[u];
    chk[u] = 1;
    long long sep = is_sep[u];

    for (auto &v: edge[u]) {
        if(chk[v]) continue;
        solve(v, u);
        ans += sep * sum_node_cnt * node_cnt[v] * 2;
        sum_node_cnt += node_cnt[v];
    }
    
    if(!sep) {
        return;
    }

    for(auto &v: edge[u]) {
        if(par != v && mypar[v] != u) continue;
        int bcc = bcce[u][v];
        if(par != v) {
            ans += (node_cnt[1] - node_cnt[v] - 1) * p[bcc] * 2;
        }
        else {
            ans += (node_cnt[1] - node_cnt[u]) * p[bcc] * 2;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n, m; cin >> n >> m;
    for(int i = 0; i < m; i++) {
        int x, y; cin >> x >> y;
        edge[x].push_back(y);
        edge[y].push_back(x);
    }
    for (int i = 1; i <= n; i++) {
        if (pre[i]) {
            continue;
        }
        dfs(1, 0);
    }
    for (int i = 1; i <= n; i++) {
        if (chk[i]) {
            continue;
        }
        solve(i, 0);
    }
    cout << ans << "\n";
    return 0;
}
# Verdict Execution time Memory Grader output
1 Incorrect 9 ms 16724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 9 ms 16724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 184 ms 53572 KB Output is correct
2 Correct 183 ms 53480 KB Output is correct
3 Incorrect 126 ms 38768 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 16952 KB Output is correct
2 Correct 10 ms 16980 KB Output is correct
3 Correct 14 ms 17040 KB Output is correct
4 Correct 10 ms 17108 KB Output is correct
5 Correct 10 ms 17108 KB Output is correct
6 Correct 12 ms 17108 KB Output is correct
7 Correct 11 ms 17108 KB Output is correct
8 Correct 10 ms 17108 KB Output is correct
9 Correct 13 ms 16980 KB Output is correct
10 Incorrect 10 ms 16852 KB Output isn't correct
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 146 ms 42316 KB Output is correct
2 Correct 162 ms 42228 KB Output is correct
3 Correct 174 ms 42216 KB Output is correct
4 Correct 143 ms 42304 KB Output is correct
5 Correct 143 ms 42188 KB Output is correct
6 Correct 155 ms 51472 KB Output is correct
7 Correct 158 ms 48460 KB Output is correct
8 Correct 164 ms 46860 KB Output is correct
9 Correct 171 ms 45328 KB Output is correct
10 Incorrect 108 ms 34080 KB Output isn't correct
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 16980 KB Output is correct
2 Correct 10 ms 16988 KB Output is correct
3 Incorrect 10 ms 16980 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 141 ms 42304 KB Output is correct
2 Correct 158 ms 42264 KB Output is correct
3 Incorrect 151 ms 42832 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 9 ms 16724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 9 ms 16724 KB Output isn't correct
2 Halted 0 ms 0 KB -