# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
925333 | 2024-02-11T13:02:15 Z | codefox | 철인 이종 경기 (APIO18_duathlon) | C++14 | 1 ms | 348 KB |
#include<bits/stdc++.h> using namespace std; #define int ll #define ll long long #define pii pair<int, int> vector<vector<int>> graph; vector<vector<int>> cgraph; vector<vector<ll>> opt; vector<int> comp; vector<int> low; vector<int> num; vector<int> vis; vector<int> art; vector<ll> compsize; stack<int> s; ll sol = 0; int c = 0; int d = 0; ll n, m; 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]) { dfs(ele, i); if (low[ele]==num[i]) { while(s.top() != i) { comp[s.top()] = d; compsize[d]++; s.pop(); } d++; } } low[i] = min(low[i], low[ele]); } if (num[i]==low[i]) { art[d] = 1; while (s.top() != i) { comp[s.top()] = d; compsize[d]++; s.pop(); } comp[i] = d; compsize[d]++; s.pop(); d++; } } void dfs2(int i) { cout << i << " " << sol << endl; vis[i] = 1; opt[i][0] = compsize[i]; opt[i][1] = compsize[i]*(compsize[i]-1); sol += (compsize[i]-2)*compsize[i]*(compsize[i]-1); if (!art[i]) sol += compsize[i]*(compsize[i]-1); vector<array<ll, 2>> ones; ll sum = 0; for (int ele:cgraph[i]) { if (vis[ele]) continue; dfs2(ele); opt[i][0] += opt[ele][0]; opt[i][1] += opt[ele][1] + opt[ele][0]*compsize[i]; sum += opt[ele][0]; ones.push_back({opt[ele][0], opt[ele][1]}); sol += opt[ele][0]*(compsize[i]-1)*(compsize[i]-2)*2; sol += opt[ele][0]*(compsize[i]-1)*2; if (!art[i]) sol += opt[ele][0]*(compsize[i]-1)*2; sol += opt[ele][1]*compsize[i]*2; } for (array<ll, 2> ele:ones) { if (!art[i]) sol += ele[0]*(sum-ele[0])*(compsize[i]+1); else sol += ele[0]*(sum-ele[0])*(compsize[i]); sol += ele[1]*(sum-ele[0])*2; } } int32_t main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); cin >> n >> m; graph.assign(n, vector<int>()); cgraph.assign(n, vector<int>()); compsize.assign(n, 0); low.assign(n, 0); num.assign(n, 0); comp.assign(n, -1); vis.assign(n, 0); art.assign(n, 0); opt.assign(n, vector<ll>(2, 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); } for (int i = 0; i < n; i++) { if (!num[i]) { dfs(i, -1); } } for (int i = 0; i <n; i++) { for (int ele:graph[i]) { if (comp[i] == comp[ele]) continue; cgraph[comp[i]].push_back(comp[ele]); } } for (int i = 0; i < n; i++) { if (!vis[comp[i]]) { dfs2(comp[i]); } } cout << sol << "\n"; return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 344 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 344 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 0 ms | 348 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 0 ms | 344 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 344 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 0 ms | 348 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 0 ms | 348 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 344 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 344 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |