Submission #866162

#TimeUsernameProblemLanguageResultExecution timeMemory
866162alexander707070Duathlon (APIO18_duathlon)C++14
31 / 100
74 ms31844 KiB
#include<bits/stdc++.h> #define MAXN 200007 using namespace std; long long n,m,a[MAXN],b[MAXN]; long long sz[MAXN],szcomp[MAXN],total[MAXN],rem[MAXN]; int comp[MAXN],k; vector< pair<int,int> > v[MAXN]; vector<int> tree[MAXN]; long long ans; int dep[MAXN],low[MAXN]; bool li[MAXN],bridge[MAXN]; void bcc(int x,int p,int d,int e){ li[x]=true; dep[x]=d; low[x]=dep[x]; for(int i=0;i<v[x].size();i++){ if(!li[v[x][i].first]){ bcc(v[x][i].first,x,d+1,v[x][i].second); low[x]=min(low[x],low[v[x][i].first]); }else if(v[x][i].first!=p){ low[x]=min(low[x],dep[v[x][i].first]); } } if(p!=0 and low[x]==dep[x]){ bridge[e]=true; } } void dfs(int x,int c){ li[x]=true; comp[x]=c; szcomp[c]++; for(int i=0;i<v[x].size();i++){ if(li[v[x][i].first] or bridge[v[x][i].second])continue; dfs(v[x][i].first,c); } } void dfs2(int x,int p){ sz[x]=szcomp[x]; for(int i=0;i<tree[x].size();i++){ if(tree[x][i]==p)continue; dfs2(tree[x][i],x); sz[x]+=sz[tree[x][i]]; } } void dfs3(int x,int p,int t){ total[x]=t; for(int i=0;i<tree[x].size();i++){ if(tree[x][i]==p)continue; dfs3(tree[x][i],x,t); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=m;i++){ cin>>a[i]>>b[i]; v[a[i]].push_back({b[i],i}); v[b[i]].push_back({a[i],i}); } for(int i=1;i<=n;i++){ if(!li[i])bcc(i,0,0,0); } for(int i=1;i<=n;i++)li[i]=false; for(int i=1;i<=n;i++){ if(!li[i]){ k++; dfs(i,k); } } for(int i=1;i<=m;i++){ if(comp[a[i]]==comp[b[i]])continue; tree[comp[a[i]]].push_back(comp[b[i]]); tree[comp[b[i]]].push_back(comp[a[i]]); } for(int i=1;i<=k;i++){ if(sz[i]==0){ dfs2(i,0); dfs3(i,0,sz[i]); } } for(int i=1;i<=m;i++){ if(comp[a[i]]==comp[b[i]])continue; if(sz[comp[a[i]]]<sz[comp[b[i]]])swap(a[i],b[i]); rem[a[i]]+=sz[comp[b[i]]]; rem[b[i]]+=total[comp[b[i]]]-sz[comp[b[i]]]; } for(int i=1;i<=k;i++){ ans+=(total[i]-szcomp[i])*(total[i]-szcomp[i]-1)*szcomp[i]; for(int f=0;f<tree[i].size();f++){ if(sz[tree[i][f]]<sz[i]){ ans-=sz[tree[i][f]]*(sz[tree[i][f]]-1)*szcomp[i]; }else{ ans-=(total[i]-sz[i])*(total[i]-sz[i]-1)*szcomp[i]; } } } for(int i=1;i<=n;i++){ ans+=(szcomp[comp[i]]-1)*(total[comp[i]]-szcomp[comp[i]]-rem[i])*2; } for(int i=1;i<=k;i++){ ans+=szcomp[i]*(szcomp[i]-1)*(szcomp[i]-2); } cout<<ans<<"\n"; return 0; }

Compilation message (stderr)

count_triplets.cpp: In function 'void bcc(int, int, int, int)':
count_triplets.cpp:20:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs(int, int)':
count_triplets.cpp:38:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs2(int, int)':
count_triplets.cpp:47:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |     for(int i=0;i<tree[x].size();i++){
      |                 ~^~~~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs3(int, int, int)':
count_triplets.cpp:58:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |     for(int i=0;i<tree[x].size();i++){
      |                 ~^~~~~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:115:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |         for(int f=0;f<tree[i].size();f++){
      |                     ~^~~~~~~~~~~~~~~
#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...