제출 #362301

#제출 시각아이디문제언어결과실행 시간메모리
362301Berted철인 이종 경기 (APIO18_duathlon)C++14
100 / 100
170 ms50968 KiB
#include <iostream> #include <vector> #define ll long long #define vi vector<int> #define pii pair<int, int> #define fst first #define snd second using namespace std; int N, M; vi adj[100001]; int vis[100001], low[100001], idx = 0, tp[100001], sz[200001]; bool isArc[100001]; vi stack; vector<vi> comp; bool done[200001]; vi tree[200001]; ll DP[200001][2], temp[200001][2], res = 0; void DFS(int u, int p) { vis[u] = low[u] = idx++; stack.push_back(u); for (auto v : adj[u]) { if (vis[v] == -1) { DFS(v, u); low[u] = min(low[u], low[v]); if (low[v] >= vis[u]) { isArc[u] = (vis[u] > 0 || vis[v] > 1); comp.push_back({u}); while (comp.back().back() != v) { comp.back().push_back(stack.back()); stack.pop_back(); } } } else if (v != p) low[u] = min(low[u], vis[v]); } } inline int buildBCT() { int cnt = 0; for (int i = 0; i < N; i++) { if (isArc[i]) {tp[i] = cnt; sz[cnt++] = 1;} } for (const auto &v : comp) { for (const auto &x : v) { if (isArc[x]) { tree[tp[x]].push_back(cnt); tree[cnt].push_back(tp[x]); } } sz[cnt++] = v.size(); } return cnt; } void DFST(int u, int p) { if (done[u]) {return;} done[u] = 1; for (auto v : tree[u]) { if (v != p) { DFST(v, u); DP[u][0] += DP[v][0]; DP[u][1] += DP[v][1]; } } if (sz[u] == 1) { DP[u][1] -= DP[u][0]; DP[u][0]++; temp[u][0] = 1; temp[u][1] = 0; for (auto v : tree[u]) { if (v != p) {temp[v][1] = DP[v][1] - DP[v][0];} } } else { ll S = sz[u] - tree[u].size(); res += S * (S - 1) * (S - 2); res += tree[u].size() * S * (S - 1); DP[u][0] += S; DP[u][1] += sz[u] * DP[u][0]; temp[u][0] = S; temp[u][1] = sz[u] * S; for (auto v : tree[u]) { if (v != p) {temp[v][1] = DP[v][1] + sz[u] * DP[v][0];} } } for (auto v : tree[u]) { if (v != p) { res += (DP[u][1] - temp[v][1]) * DP[v][0] + (DP[u][0] - DP[v][0]) * DP[v][1] - 2 * DP[v][0] * (DP[u][0] - DP[v][0]); res += temp[u][1] * DP[v][0] + temp[u][0] * DP[v][1] - 2 * DP[v][0] * temp[u][0]; } } } int32_t main() { ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M; for (int i = 0; i < N; i++) {vis[i] = -1;} for (int i = 0; i < M; i++) { int u, v; cin >> u >> v; adj[u - 1].push_back(v - 1); adj[v - 1].push_back(u - 1); } for (int i = 0; i < N; i++) { if (vis[i] == -1) {DFS(i, -1);} } N = buildBCT(); for (int i = 0; i < N; i++) { if (sz[i] > 1) { DFST(i, -1); } } cout << res << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...