Submission #1087764

#TimeUsernameProblemLanguageResultExecution timeMemory
1087764alexander707070Duathlon (APIO18_duathlon)C++14
31 / 100
67 ms26448 KiB
#include<bits/stdc++.h> #define MAXN 200007 using namespace std; int n,m,a[MAXN],b[MAXN],k; vector< pair<int,int> > v[MAXN]; vector<int> tree[MAXN]; long long sz[MAXN],sum[MAXN],szcomp[MAXN],ans; bool li[MAXN],bridge[MAXN]; int dp[MAXN],low[MAXN]; int comp[MAXN],where[MAXN]; void bcc(int x,int p,int dep,int edge){ li[x]=true; dp[x]=low[x]=dep; for(int i=0;i<v[x].size();i++){ if(!li[v[x][i].first]){ bcc(v[x][i].first,x,dep+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],dp[v[x][i].first]); } } if(p!=0 and low[x]==dp[x]){ bridge[edge]=true; } } void mark(int x){ comp[k]++; where[x]=k; li[x]=true; for(int i=0;i<v[x].size();i++){ if(li[v[x][i].first] or bridge[v[x][i].second])continue; mark(v[x][i].first); } } void dfs(int x,int p){ sz[x]=comp[x]; for(int i=0;i<tree[x].size();i++){ if(tree[x][i]==p)continue; dfs(tree[x][i],x); sum[x]+=sz[tree[x][i]]*(sz[tree[x][i]]-1); sz[x]+=sz[tree[x][i]]; } } void dfs2(int x,int p,int s){ szcomp[x]=s; for(int i=0;i<tree[x].size();i++){ if(tree[x][i]==p)continue; dfs2(tree[x][i],x,s); } sum[x]+=(s-sz[x])*(s-sz[x]-1); } 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++; mark(i); } } for(int i=1;i<=m;i++){ if(where[a[i]]==where[b[i]])continue; tree[where[a[i]]].push_back(where[b[i]]); tree[where[b[i]]].push_back(where[a[i]]); } for(int i=1;i<=k;i++){ if(sz[i]==0){ dfs(i,0); dfs2(i,0,sz[i]); } } for(int i=1;i<=k;i++){ ans+=(long long) comp[i]*((szcomp[i]-1)*(szcomp[i]-2)-sum[i]); } 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 mark(int)':
count_triplets.cpp:39: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]
   39 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs(int, int)':
count_triplets.cpp:48:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |     for(int i=0;i<tree[x].size();i++){
      |                 ~^~~~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs2(int, int, int)':
count_triplets.cpp:60:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |     for(int i=0;i<tree[x].size();i++){
      |                 ~^~~~~~~~~~~~~~~
#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...