Submission #261417

#TimeUsernameProblemLanguageResultExecution timeMemory
261417HideoDuathlon (APIO18_duathlon)C++17
23 / 100
206 ms29440 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; int h[N], d[N], sz[N], mn[N], rev[N], dp[N], mns[N], total[N]; int n, m, csz; vi g[N], despawn[N], spawn[N]; 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]] += mns[h[to]]; total[v] += total[to]; mns[h[to]] = 0; temp = min(temp, mn[to]); } } if (temp != INF && temp != mn[v]) spawn[temp].pb(v); for (int it : despawn[h[v]]) total[v] -= dp[it]; despawn[h[v]].clear(); for (int it : spawn[h[v]]){ total[v] += dp[it]; despawn[mn[it]].pb(it); } spawn[h[v]].clear(); mns[mn[v]]++; dp[v] = sz[v] - 1 - mns[h[v]] + total[v]; S2 += 1LL * (csz - sz[v]) * dp[v]; } 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]]) * (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 * (h[v] - mn[to]) * s; s += sz[to]; calc4(to); } } } 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); } } //cout << S1 << ' ' << S2 << ' ' << S3 << ' ' << S4 << endl; cout << S1 + 2LL * (S2 + S3 + S4); }

Compilation message (stderr)

count_triplets.cpp:115: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...