Submission #260882

#TimeUsernameProblemLanguageResultExecution timeMemory
260882emanIaicepsaDuathlon (APIO18_duathlon)C++14
31 / 100
173 ms24824 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<ll,ll> #define vi vector<int> #define pb emplace_back #define fi first #define se second #define all(n) (n).begin(),(n).end() #define mem(n,m) memset(n,m,sizeof(n)) #define IOS ios::sync_with_stdio(0), cin.tie(0) #define dbg(...) cerr<<#__VA_ARGS__<<" = ";_do(__VA_ARGS__); template<typename A> void _do(A x){cerr<<x<<'\n';} template<typename A,typename ...B> void _do(A x,B ...y){cerr<<x<<", ";_do(y...);} ll n,m; vi E[100005]; ll siz[100005], ans=0; bool vis[100005]; int pa[100005][18], dep[100005]; ll C(ll x){ return (x)*(x-1)*(x-2)/6*2; } ll P(ll x){ return C(x)*3; } vector<pii> circ; void dfs(int x,int p){ vis[x] = 1; siz[x] = 1; dep[x] = dep[p] + 1; pa[x][0] = p; for(int i=1;i<=__lg(n);i++){ pa[x][i] = pa[ pa[x][i-1] ][i-1]; } for(auto i:E[x]){ if(i==p) continue; else if(vis[i]){ if(x<i)circ.pb(x,i); } else{ dfs(i,x); siz[x] += siz[i]; } } } void dfs2(int x,int p,int anc){ vis[x] = 1; for(auto i:E[x]){ if(vis[i]) continue; dfs2(i,x,anc); ans += siz[i] * (siz[anc]-siz[i]-1); } ans += (siz[x]-1) * (siz[anc]-siz[x]); } int dis(int x,int y){ ll ans = 0; if(dep[x]<dep[y]) swap(x,y); for(int i=__lg(n),le=dep[x]-dep[y];i>=0;i--){ if(le>=(1<<i)){ le -= 1<<i; ans += 1<<i; x = pa[x][i]; } } if(x==y) return ans; for(int i=__lg(n);i>=0;i--){ if(pa[x][i] != pa[y][i]){ x = pa[x][i]; y = pa[y][i]; ans += (1<<i)*2; } } return ans+2; } signed main(){ IOS; cin>>n>>m; for(int i=1,a,b;i<=m;i++){ cin>>a>>b; E[a].pb(b); E[b].pb(a); } for(int i=1;i<=n;i++) if(!vis[i]) dfs(i,0); mem(vis,0); for(int i=1;i<=n;i++) if(!vis[i]) dfs2(i,0,i); for(auto i:circ){ int d = dis(i.fi,i.se) + 1; ans -= C(d); ans += P(d); } cout<<ans<<'\n'; } /* 3 3 1 2 2 3 3 1 */
#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...