Submission #757257

# Submission time Handle Problem Language Result Execution time Memory
757257 2023-06-12T21:38:30 Z shjgkwo Duathlon (APIO18_duathlon) C++17
0 / 100
221 ms 53580 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(i, 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 Correct 9 ms 16724 KB Output is correct
2 Correct 10 ms 16724 KB Output is correct
3 Correct 10 ms 16792 KB Output is correct
4 Correct 9 ms 16724 KB Output is correct
5 Correct 8 ms 16804 KB Output is correct
6 Correct 9 ms 16724 KB Output is correct
7 Incorrect 9 ms 16724 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 16724 KB Output is correct
2 Correct 10 ms 16724 KB Output is correct
3 Correct 10 ms 16792 KB Output is correct
4 Correct 9 ms 16724 KB Output is correct
5 Correct 8 ms 16804 KB Output is correct
6 Correct 9 ms 16724 KB Output is correct
7 Incorrect 9 ms 16724 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 221 ms 53580 KB Output is correct
2 Correct 185 ms 53452 KB Output is correct
3 Incorrect 174 ms 48072 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 11 ms 16980 KB Output is correct
2 Correct 10 ms 16980 KB Output is correct
3 Correct 10 ms 16984 KB Output is correct
4 Correct 10 ms 17108 KB Output is correct
5 Correct 11 ms 17036 KB Output is correct
6 Correct 11 ms 17108 KB Output is correct
7 Correct 12 ms 17108 KB Output is correct
8 Correct 10 ms 17108 KB Output is correct
9 Correct 10 ms 16980 KB Output is correct
10 Incorrect 11 ms 17096 KB Output isn't correct
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 145 ms 42336 KB Output is correct
2 Correct 145 ms 42308 KB Output is correct
3 Correct 172 ms 42204 KB Output is correct
4 Correct 145 ms 42220 KB Output is correct
5 Correct 146 ms 42200 KB Output is correct
6 Correct 164 ms 51512 KB Output is correct
7 Correct 162 ms 48492 KB Output is correct
8 Correct 171 ms 46888 KB Output is correct
9 Correct 164 ms 45328 KB Output is correct
10 Incorrect 131 ms 42304 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 16980 KB Output is correct
3 Incorrect 10 ms 16972 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 152 ms 42300 KB Output is correct
2 Correct 152 ms 42184 KB Output is correct
3 Incorrect 151 ms 42828 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 16724 KB Output is correct
2 Correct 10 ms 16724 KB Output is correct
3 Correct 10 ms 16792 KB Output is correct
4 Correct 9 ms 16724 KB Output is correct
5 Correct 8 ms 16804 KB Output is correct
6 Correct 9 ms 16724 KB Output is correct
7 Incorrect 9 ms 16724 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 16724 KB Output is correct
2 Correct 10 ms 16724 KB Output is correct
3 Correct 10 ms 16792 KB Output is correct
4 Correct 9 ms 16724 KB Output is correct
5 Correct 8 ms 16804 KB Output is correct
6 Correct 9 ms 16724 KB Output is correct
7 Incorrect 9 ms 16724 KB Output isn't correct
8 Halted 0 ms 0 KB -