Submission #261484

#TimeUsernameProblemLanguageResultExecution timeMemory
261484HideoDuathlon (APIO18_duathlon)C++17
31 / 100
246 ms41072 KiB
//1610612741, 1000000007 //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //#pragma GCC optimization ("O3") //#pragma GCC optimization ("unroll-loops") //#pragma GCC optimize ("Ofast") //#pragma GCC target ("avx,avx2,fma") #include <bits/stdc++.h> using namespace std; #define all(s) s.begin(), s.end() #define ok puts("ok") #define ll long long #define pb push_back #define mk make_pair #define fr first #define sc second #define vi vector < int > #define pi pair < int, int > #define pii pair < int, pi > #define next next123 #define left left123 const int N = 2e5 + 7; const int INF = 1e9 + 7; ll S1, S2, S3, S4, S5; int h[N], d[N], sz[N], mn[N], rev[N], con[N]; int dp[N][2], mns[N][2], total[N][2]; int n, m, csz; vi g[N], despawn[N][2], spawn[N][2]; void precalc (int v, int p = 0){ h[v] = h[p] + 1; sz[v] = 1; mn[v] = h[v]; for (int to : g[v]){ if (!h[to]){ precalc(to, v); sz[v] += sz[to]; mn[v] = min(mn[v], mn[to]); } else { mn[v] = min(mn[v], h[to]); } } } void calc1 (int v){ for (int to : g[v]){ if (h[to] - h[v] == 1){ calc1(to); S1 += 1LL * (csz - sz[to] - 1) * sz[to]; } } S1 += 1LL * (csz - sz[v]) * (sz[v] - 1); } void calc2 (int v){ int temp = INF; for (int to : g[v]){ if (h[to] - h[v] == 1){ calc2(to); mns[h[v]][0] += mns[h[to]][0]; mns[h[v]][1] += mns[h[to]][1]; total[v][0] += total[to][0]; total[v][1] += total[to][1]; mns[h[to]][0] = 0; mns[h[to]][1] = 0; temp = min(temp, mn[to]); } } if (temp != INF && temp != mn[v]) spawn[temp][0].pb(v); if (temp != INF && temp + 1 != mn[v] && h[v] - mn[v] > 2) spawn[min(h[v], temp + 1)][1].pb(v); for (int it : despawn[h[v]][0]) total[v][0] -= dp[it][0]; despawn[h[v]][0].clear(); for (int it : despawn[h[v]][1]) total[v][1] -= dp[it][0]; despawn[h[v]][1].clear(); for (int it : spawn[h[v]][0]){ total[v][0] += dp[it][0]; despawn[mn[it]][0].pb(it); } spawn[h[v]][0].clear(); for (int it : spawn[h[v]][1]){ total[v][1] += dp[it][0]; despawn[mn[it] + 1][1].pb(it); } spawn[h[v]][1].clear(); dp[v][0] = sz[v] - 1 - mns[h[v]][0] + total[v][0]; dp[v][1] = sz[v] - 1 - mns[h[v]][1] + total[v][1]; mns[mn[v]][0]++; mns[mn[v] + 1][1]++; S2 += 1LL * (csz - sz[v]) * dp[v][0]; } bool comp (int a, int b){ return mn[a] > mn[b]; } void calc3 (int v){ rev[h[v]] = v; for (int to : g[v]){ if (h[to] - h[v] == 1){ calc3(to); S3 += 1LL * sz[to] * ((h[v] - mn[v] - 1) * (h[v] - mn[v]) - (h[v] - mn[to] - 1) * (h[v] - mn[to])) / 2; S3 += 1LL * sz[to] * (mn[v] - mn[rev[mn[v] + 1]]) * (h[v] - mn[v] - 1) - (mn[rev[mn[to] + 1]] - mn[v]) * (max(0, h[v] - mn[to] - 1)); } } S3 += 1LL * (h[v] - mn[v] - 1) * (h[v] - mn[v]) / 2; S3 += 1LL * (mn[v] - mn[rev[mn[v] + 1]]) * (max(0, h[v] - mn[v] - 1)); } void calc4 (int v){ int s = 0; sort(all(g[v]), comp); for (int to : g[v]){ if (h[to] - h[v] == 1){ if (mn[to] < h[v]) S4 += 1LL * sz[to] * (h[v] - mn[to]) * s; s += sz[to]; calc4(to); } } } void calc5 (int v){ int s = 0; for (int to : g[v]){ if (h[to] - h[v] == 1){ calc5(to); con[to] += dp[to][1]; if (mn[to] < h[v]) con[to]++; s += con[to]; } } for (int to : g[v]) if (h[to] - h[v] == 1) S5 += 1LL * con[to] * (sz[v] - sz[to] - 1) * (csz - sz[v]); } main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for (int i = 1; i <= m; i++){ int a, b; cin >> a >> b; g[a].pb(b); g[b].pb(a); } for (int i = 1; i <= n; i++) if (!h[i]) precalc(i); for (int i = 1; i <= n; i++){ if (h[i] == 1){ csz = sz[i]; calc1(i); calc2(i); calc3(i); calc4(i); calc5(i); } } //cout << S1 << ' ' << S2 << ' ' << S3 << ' ' << S4 << ' ' << S5 << endl; cout << S1 + 2LL * (S2 + S3 + S4 + S5); }

Compilation message (stderr)

count_triplets.cpp:152:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(){
      ^
#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...