제출 #297384

#제출 시각아이디문제언어결과실행 시간메모리
297384srvlt철인 이종 경기 (APIO18_duathlon)C++14
30 / 100
69 ms13048 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define pb push_back #define all(x) begin(x), end(x) #define SZ(x) (int)(x).size() #define cps(x) sort(all(x)), (x).erase(unique(all(x)), end(x)) #define cps2(x, y) sort(all(x), y), (x).erase(unique(all(x)), end(x)) #define mem(x, y) memset(& x, y, sizeof(x)) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int n0 = 1003; int n, m, root, used[n0], sz[n0]; int up[n0], up2[n0], in[n0], T, last[n0], up3[n0][n0]; vector <int> g[n0]; ll cur; void dfs(int v, int p) { used[v] = 1, sz[v] = 1, in[v] = ++T; up[v] = up2[v] = in[v]; for (int to : g[v]) { if (to == p) continue; if (used[to] == 1 && in[to] < in[v]) up[v] = min(up[v], in[to]), up2[v] = min(up2[v], in[to]); if (!used[to]) { dfs(to, v); sz[v] += sz[to]; up[v] = min(up[v], up[to]); } } used[v] = 2; } void dfs2(int v, int p) { used[v] = 1; if (v == root) last[v] = 1; else { last[v] = last[p]; if (up3[p][v] == 1) last[v] = in[p]; if (up2[v] == 1) last[v] = in[v]; } int mn = -1, mn2 = -1; for (int to : g[v]) { if (!used[to]) { if (mn == -1 || up[mn] > up[to]) { mn2 = mn; mn = to; } else if (mn2 == -1 || up[mn2] > up[to]) { mn2 = to; } } } for (int to : g[v]) { if (!used[to]) { if (mn == to) { int x = up2[v]; if (mn2 != -1) x = min(x, up[mn2]); up3[v][to] = x; } else up3[v][to] = min(up2[v], up[mn]); } } ll bad = 1; for (int to : g[v]) { if (!used[to]) { dfs2(to, v); if (v != root && up[to] > 1 && up[to] >= last[v]) { cur += bad * sz[to]; bad += sz[to]; } } } } ll comp; void go(int v) { used[v] = 1, comp++; for (int to : g[v]) if (!used[to]) go(to); } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); cin >> n >> m; for (int i = 0; i < m; i++) { int x, y; cin >> x >> y; g[x].pb(y), g[y].pb(x); } ll res = 0; for (int i = 1; i <= n; i++) { if (!used[i]) { comp = 0; go(i); res += comp * (comp - 1) * (comp - 2); } } for (int i = 1; i <= n; i++) { root = i, cur = T = 0; mem(used, 0); dfs(i, i); mem(used, 0), mem(last, 0); dfs2(i, i); cur *= 2; res -= cur; } cout << res; }
#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...