Submission #250766

#TimeUsernameProblemLanguageResultExecution timeMemory
250766fivefourthreeoneDuathlon (APIO18_duathlon)C++17
100 / 100
312 ms38108 KiB
#include <bits/stdc++.h> #define owo(i,a, b) for(int i=(a); i<(b); ++i) #define uwu(i,a, b) for(int i=(a)-1; i>=(b); --i) #define senpai push_back #define ttgl pair<int, int> #define ayaya cout<<"ayaya~"<<endl using namespace std; using ll = long long; using ld = long double; const ll MOD = 998244353; int gcd(int a,int b){return b?gcd(b,a%b):a;} ll binpow(ll a,ll b){ll res=1;while(b){if(b&1)res=(res*a)%MOD;a=(a*a)%MOD;b>>=1;}return res;} ll modInv(ll a){return binpow(a, MOD-2);} const double PI = acos(-1); const int INF = 0x3f3f3f3f; const int NINF = 0xc0c0c0c0; const ll INFLL = 0x3f3f3f3f3f3f3f3f; const ll NINFLL = 0xc0c0c0c0c0c0c0c0; const int mxN = 200001; vector<int> adj[mxN]; vector<int> tree[mxN]; int cnt = 0; bool flag[mxN]; int par[mxN], low[mxN], tin[mxN]; ll compsz[mxN]; ll sz[mxN]; int co = 0; int n, m; int totsz = 0; vector<vector<ttgl>> fin; vector<ttgl> st; ll ans = 0; void get(int u, bool root = 0) { tin[u]=low[u] = cnt++; int child = 0; for(int v: adj[u]) { if(v==par[u])continue; if(tin[v]==-1) { child++; par[v] = u; st.senpai({u, v}); get(v); low[u] = min(low[v], low[u]); if((root&&child>1)||(!root&&tin[u]<=low[v])) { vector<ttgl> temp; while(st.back()!=(ttgl{u, v})) { temp.senpai(st.back()); st.pop_back(); } temp.senpai(st.back()); st.pop_back(); fin.senpai(temp); } }else if(tin[v]<=tin[u]){ low[u] = min(tin[v], low[u]); st.senpai({u, v}); } } } void bcc() { memset(par, -1, sizeof(par)); memset(low, -1, sizeof(low)); memset(tin, -1, sizeof(tin)); owo(i, 0, n) { if(tin[i]==-1) { get(i, 1); if(st.size()>0) { fin.senpai(st); } st.clear(); } } for(auto a: fin) { set<int> s; for(auto b: a) { s.insert(b.first);s.insert(b.second); } compsz[co] = s.size(); for(int k: s) { tree[k].senpai(n+co); tree[n+co].senpai(k); } co++; } } void dfssz(int u, int p) { flag[u] = true; sz[u] = u<n; for(int v: tree[u]) { if(v^p) { dfssz(v, u); sz[u]+=sz[v]; } } } void solve(int u, int p, int rt) { if(u<n) { for(int v: tree[u]) { if(v^p) { ans-=(compsz[v-n]-1)*(sz[rt]-sz[v])*(sz[rt]-sz[v]-1); }else { ans-=(compsz[v-n]-1)*(sz[u]*(sz[u]-1)); } } } for(int v: tree[u]) if(v^p) { solve(v, u, rt); } } int main() { //freopen("exercise.in", "r", stdin); //freopen("exercise.out", "w", stdout); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); cin.tie(0)->sync_with_stdio(0); cin>>n>>m; int a, b; owo(i, 0, m) { cin>>a>>b; a--; b--; adj[a].senpai(b); adj[b].senpai(a); } bcc(); owo(i, 0, n) { if(!flag[i]) { dfssz(i, i); ans+=(sz[i]*(sz[i]-1)*(sz[i]-2)); solve(i, i, i); } } cout<<ans<<"\n"; 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...