Submission #408585

#TimeUsernameProblemLanguageResultExecution timeMemory
408585talant117408Duathlon (APIO18_duathlon)C++17
100 / 100
145 ms28992 KiB
/* Code written by Talant I.D. */ #include <bits/stdc++.h> //~ #include <ext/pb_ds/assoc_container.hpp> //~ using namespace __gnu_pbds; using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; //~ typedef tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; #define precision(n) fixed << setprecision(n) #define pb push_back #define ub upper_bound #define lb lower_bound #define mp make_pair #define eps (double)1e-9 #define PI 2*acos(0.0) //~ #define endl "\n" #define sz(v) int((v).size()) #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define OK cout << "OK" << endl; const int mod = 1e9+7; ll mode(ll a) { while (a < 0) { a += mod; } return a % mod; } ll subt(ll a, ll b) { return mode(mode(a)-mode(b)); } ll add(ll a, ll b) { return mode(mode(a)+mode(b)); } ll mult(ll a, ll b) { return mode(mode(a)*mode(b)); } ll binpow(ll a, ll b) { ll res = 1; while (b) { if (b&1) res = mult(res, a); a = mult(a, a); b >>= 1; } return res; } const int MAXN = 1e5+7; vector <int> graph[MAXN], comps_graph[MAXN * 2], stacc; int timer, fup[MAXN], tin[MAXN], compsn = 1; ll ans, subtree[MAXN * 2], N; ll n, m; void find_artpoints(int v, int p = 0) { tin[v] = fup[v] = ++timer; stacc.pb(v); N++; for (auto to : graph[v]) { if (to == p) { continue; } if (tin[to]) { fup[v] = min(fup[v], tin[to]); } else { find_artpoints(to, v); fup[v] = min(fup[v], fup[to]); if (fup[to] >= tin[v]) { comps_graph[v].pb(n + compsn); while (!sz(comps_graph[n + compsn]) || comps_graph[n + compsn].back() != to) { comps_graph[n + compsn].pb(stacc.back()); stacc.pop_back(); } compsn++; } } } } void dfs2(int v, int p = -1) { subtree[v] = (v <= n); for (auto to : comps_graph[v]) { dfs2(to, v); subtree[v] += subtree[to]; if (v > n) { ans -= 1ll * sz(comps_graph[v]) * subtree[to] * (subtree[to] - 1); } } if (v > n) { ans -= 1ll * sz(comps_graph[v]) * (N - subtree[v]) * (N - subtree[v] - 1); } } int main() { do_not_disturb cin >> n >> m; for (int i = 0; i < m; i++) { int x, y; cin >> x >> y; graph[x].pb(y); graph[y].pb(x); } for (int i = 1; i <= n; i++) { if (!tin[i]) { N = 0; find_artpoints(i); ans += 1ll * N * (N - 1) * (N - 2); dfs2(i); } } cout << ans; 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...