Submission #407799

#TimeUsernameProblemLanguageResultExecution timeMemory
407799talant117408Duathlon (APIO18_duathlon)C++17
0 / 100
1100 ms27096 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 N = 1e5+7; vector <int> graph[N], comps_graph[N]; map <pii, bool> isBridge; int timer, ind[N], fup[N], tin[N], used[N]; ll dp[N], ans, val[N], subtree[N]; int n, m, compsn; void find_bridges(int v, int p = -1) { used[v] = 1; tin[v] = fup[v] = ++timer; for (auto to : graph[v]) { if (to == p) { continue; } if (used[to]) { fup[v] = min(fup[v], tin[to]); } else { find_bridges(to, v); fup[v] = min(fup[v], fup[to]); if (fup[to] > tin[v]) { isBridge[mp(v, to)] = isBridge[mp(to, v)] = 1; } } } } void find_comps(int v, int p = -1) { used[v] = 1; ind[v] = timer; for (auto to : graph[v]) { if (to == p) { continue; } if (isBridge[mp(to, v)]) { continue; } if (!used[to]) { find_comps(to, v); } } } void dfs(int v, int p = -1) { subtree[v] = val[v]; for (auto to : comps_graph[v]) { if (to == p) { continue; } dfs(to, v); subtree[v] += subtree[to]; } } 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 (!used[i]) { find_bridges(i); } } for (int i = 1; i <= n; i++) { used[i] = 0; } timer = 0; for (int i = 1; i <= n; i++) { if (!used[i]) { timer++; find_comps(i); } } compsn = timer; for (int i = 1; i <= n; i++) { val[ind[i]]++; for (auto to : graph[i]) { if (ind[to] != ind[i]) { comps_graph[ind[to]].pb(ind[i]); } } } for (int i = 1; i <= compsn; i++) { dfs(i); for (int j = 1; j <= compsn; j++) { if (j == i) { ans += (val[i]-1)*(val[i]-1)*(subtree[i]-val[i]); ans += (val[i])*(val[i]-1)*(val[i]-2); } else { ans += val[i]*val[j]*(subtree[j]-val[j]); ans += val[i]*(val[j]-1)*(val[j]-1); } } } 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...