Submission #99851

#TimeUsernameProblemLanguageResultExecution timeMemory
99851TadijaSebezDuathlon (APIO18_duathlon)C++11
23 / 100
232 ms36744 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int N=200050; vector<int> G[N],E[N]; void AddEdge(int u, int v){ E[u].pb(v);E[v].pb(u);} int cnt,disc[N],low[N],tid,n,csz[N]; bool in[N]; stack<int> s; void Tarjan(int u) { disc[u]=low[u]=++tid; in[u]=1;s.push(u); for(int v:G[u]) { if(!disc[v]) { Tarjan(v); low[u]=min(low[u],low[v]); if(low[v]>=disc[u]) { ++cnt; AddEdge(u,cnt); csz[cnt]++; int h; do { h=s.top(); s.pop(); in[h]=0; AddEdge(h,cnt); csz[cnt]++; }while(h!=v); } } else if(in[v]) low[u]=min(low[u],disc[v]); } } ll ans; int sz[N],dep[N],up[N]; void DFSSZ(int u, int p) { sz[u]=u<=n; dep[u]=dep[p]+(u<=n); up[u]=n; for(int v:E[u]) if(v!=p) DFSSZ(v,u),sz[u]+=sz[v],up[u]-=sz[v]; } int rt[N],par[N]; ll all[N],up_all[N],down_all[N]; void Solve(int u, int p, int root) { par[u]=p; all[u]=(ll)(sz[root]-(u<=n))*(sz[root]-(u<=n)-1); all[u]-=(ll)(sz[root]-sz[u])*(sz[root]-sz[u]-1); for(int v:E[u]) if(v!=p) all[u]-=(ll)sz[v]*(sz[v]-1); down_all[u]=(ll)(sz[u]-(u<=n))*(sz[u]-(u<=n)-1); for(int v:E[u]) if(v!=p) down_all[u]-=(ll)sz[v]*(sz[v]-1); if(p) { up_all[u]=all[p]; up_all[u]-=(ll)(sz[root]-(p<=n))*(sz[root]-(p<=n)-1); up_all[u]+=(ll)(sz[root]-sz[u]-(p<=n))*(sz[root]-sz[u]-(p<=n)-1); up_all[u]+=(ll)sz[u]*(sz[u]-1); } for(int v:E[u]) if(v!=p) Solve(v,u,root); if(u<=n) { ans+=all[u]; for(int v:E[u]) if(v!=p) ans+=down_all[v]; //if(p) ans+=up_all[u]; } //printf("u:%i ans:%lld all:%lld up_all:%lld down_all:%lld\n",u,ans,all[u],up_all[u],down_all[u]); /*ll all=(ll)sz[u]*(sz[u]-1); int ch=0; for(int v:E[u]) if(v!=p) all-=(ll)sz[v]*(sz[v]-1),ch+=csz[v]-1; if(u<=n) ans+=(ll)(sz[root]-1)*dep[p]*2; ans-=all*(dep[u]+dep[p]); //else ans-=all*(dep[u]+dep[p]); //printf("all:%lld\n",all); /*if(u<=n) { if(p) ans-=(ll)sz[u]*(csz[p]-1)*2*2; ans-=(ll)up[u]*ch*2*2; //printf("u:%i ans:%lld sz:%i up:%i dep:%i ch:%i csz[p]:%i\n",u,ans,sz[u],up[u],dep[u],ch,csz[p]); }*//* if(u>n) { //ans-=(ll)sz[root]*(csz[u]-1)*4; ans+=(ll)(sz[root]-csz[u])*(csz[u]-1)*(csz[u]-2)*2; ans+=(ll)csz[u]*(csz[u]-1)*(csz[u]-2); for(int v:E[u]) if(v!=p) { //ans-=(ll)(sz[u]-sz[v]); ans+=(ll)(sz[root]-sz[v]-csz[u]+1)*(sz[v]-1)*(csz[u]-2); } ans+=(ll)(sz[root]-up[p]-csz[u]+1)*(up[p]-1)*(csz[u]-2); } rt[u]=root; //else printf("u:%i ans:%i\n",u,ans);*/ } int main() { int m,u,v; scanf("%i %i",&n,&m); cnt=n; for(int i=1;i<=m;i++) scanf("%i %i",&u,&v),G[u].pb(v),G[v].pb(u); vector<int> root; for(int i=1;i<=n;i++) if(!disc[i]) Tarjan(i),root.pb(i); for(int i:root) DFSSZ(i,0),Solve(i,0,i); //for(int i=n+1;i<=cnt;i++) ans+=(ll)csz[i]*(csz[i]-1)*sz[rt[i]]*2-(ll)csz[i]*(csz[i]-1)*(csz[i]-2); printf("%lld\n",ans); return 0; }

Compilation message (stderr)

count_triplets.cpp:81:2: warning: "/*" within comment [-Wcomment]
  /*if(u<=n)
   
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:105:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&m);
  ~~~~~^~~~~~~~~~~~~~~
count_triplets.cpp:107:55: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=m;i++) scanf("%i %i",&u,&v),G[u].pb(v),G[v].pb(u);
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
#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...