# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
907549 | 2024-01-15T20:41:35 Z | codefox | 철인 이종 경기 (APIO18_duathlon) | C++14 | 23 ms | 55152 KB |
#include<bits/stdc++.h> using namespace std; #define ll long long vector<vector<int>> graph; vector<vector<int>> cgraph; vector<int> comp; vector<int> art; vector<int> low; vector<int> num; vector<int> vis; stack<int> s; int c = 0; int d = 0; int root = 0; int sub = 0; vector<ll> compsize; ll sol = 0; int n, m; int N = 1e6; void dfs(int i, int p) { num[i] = low[i] = ++c; s.push(i); for (int ele:graph[i]) { if (ele == p) continue; if (!num[ele]) { if (i == root) sub++; dfs(ele, i); if (low[ele]>=num[i]) art[i] = 1; if (low[ele]==num[i]) { while(s.top() != i) { comp[s.top()] = d; compsize[d]++; s.pop(); } comp[i] = d; compsize[d]++; s.pop(); d++; } low[i] = min(low[i], low[ele]); } else low[i] = min(low[i], num[ele]); } if (num[i]==low[i] && comp[i]==-1) { art[i] = 1; while (s.top() != i) { comp[s.top()] = d; compsize[d]++; s.pop(); } comp[i] = d; compsize[d]++; s.pop(); d++; } } int dfs2(int i, int p) { vis[i] = 1; ll ss = 0; vector<int> cs; vector<int> v; for (int ele:cgraph[i]) { if (!vis[ele]) { if (ele < N) cs.push_back(compsize[ele]); int h = dfs2(ele, i); ss += h; v.push_back(h); } } if (i >= N) ss++; else ss+=compsize[i]; ss-=v.size(); if (p != -1) { if (p < N) cs.push_back(compsize[p]); v.push_back(sub-ss); } if (i >= N) { for (int ele:v) { sol += (ele-1)*(sub-ele); } } else { int css = compsize[i]-v.size(); sol += (compsize[i]-1)*(compsize[i]-2)*(compsize[i]); for (ll ele:v) { sol += ele*(sub-ele-1)*(compsize[i]); } } return ss; } int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); cin >> n >> m; graph.assign(n, vector<int>()); cgraph.assign(2*N, vector<int>()); compsize.assign(n, 0); low.assign(n, 0); num.assign(n, 0); comp.assign(n, -1); art.assign(n, 0); vis.assign(2*N, 0); for (int i =0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; graph[a].push_back(b); graph[b].push_back(a); } vector<int> subtree(n, 0); for (int i = 0; i < n; i++) { if (!num[i]) { root = i; sub = 0; c = 0; dfs(i, -1); subtree[i] = c; if (sub==1) art[i] = 0; } } d = N; for (int i = 0; i <n; i++) { if (art[i]) { for (int ele:graph[i]) { cgraph[d].push_back(comp[ele]); cgraph[comp[ele]].push_back(d); } comp[i] = d; d++; } } for (int i = 0; i < n; i++) { if (!vis[comp[i]]) { sub = subtree[i]; dfs2(comp[i], -1); } } cout << sol << "\n"; return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 23 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 23 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 20 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 21 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 21 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 20 ms | 55128 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 20 ms | 55152 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 23 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 23 ms | 55132 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |