제출 #1059586

#제출 시각아이디문제언어결과실행 시간메모리
1059586vjudge1철인 이종 경기 (APIO18_duathlon)C++17
0 / 100
77 ms42524 KiB
#include<bits/stdc++.h> using namespace std; struct DDS{ int par[1<<18]; int abp(int n){ return par[n]?par[n]=abp(par[n]):n; } void merge(int a,int b){ a=abp(a),b=abp(b); if(a-b)par[a]=b; } } dsu; vector<int>adj[1<<17],adj2[1<<18]; set<pair<int,int>>st[1<<17]; int par[1<<17],dep[1<<17],cycpar[1<<17],CC,N,sz[1<<17]; void dfsC(int n,int p){ dep[n]=dep[p]+1; par[n]=p; for(auto i:adj[n]){ if(i==p)continue; if(!dep[i]) dfsC(i,n); else if(dep[i]<dep[n]) st[n].insert({dep[i],++CC}); } } void dfsM(int n,int p){ for(auto i:adj[n]) { if(par[i]-n)continue; dfsM(i,n); if(st[i].empty())continue; if(st[i].begin()->first<dep[n]) { if(st[n].size()) dsu.merge(st[i].begin()->second,st[n].begin()->second); st[n].insert(*st[i].begin()); } else adj2[n].push_back(dsu.abp(st[i].begin()->second)); } if(st[n].size()) cycpar[n]=st[n].begin()->second; else adj2[p].push_back(n); } long long TOT; void dfsA(int n){ sz[n]=n<=N; long long k=1ll*(N-sz[n])*(N-sz[n]); for(auto i:adj2[n])dfsA(i), sz[n]+=sz[i],k-=1ll*sz[i]*sz[i]; k-=1ll*(N-sz[n])*(N-sz[n]); if(n>N)k*=adj2[n].size()-1; TOT+=k; } int main(){ cin.tie(0)->sync_with_stdio(0); int n,m; cin>>n>>m; for(int i=0;i<m;i++){ int a,b;cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } CC=N=n; dfsC(1,0); dfsM(1,0); for(int i=1;i<=n;i++) if(cycpar[i]) adj2[dsu.abp(cycpar[i])].push_back(i); dfsA(1); cout<<TOT<<'\n'; }
#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...