Submission #982361

#TimeUsernameProblemLanguageResultExecution timeMemory
982361Faisal_SaqibDuathlon (APIO18_duathlon)C++17
36 / 100
1046 ms1048576 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ll long long const int N=1e5+10; vector<int> ma[N]; // ll pre[N]; bool vis[N]; ll ans=0,sz[N],dp[N],dp_[N]; void dfs(int x,int p=-1) { sz[x]=1; vis[x]=1; for(auto y:ma[x]) { if(y!=p) { dfs(y,x); sz[x]+=sz[y]; dp[x]-=(sz[y]*sz[y]); } } dp[x]+=((sz[x]-1)*(sz[x]-1)); } void ChangeRoot(int x,int y) { // dp[x]+=(sz[y]*sz[y]); dp[x]-=((sz[x]-1)*(sz[x]-1)); dp[y]-=((sz[y]-1)*(sz[y]-1)); sz[x]-=sz[y]; sz[y]+=sz[x]; dp[x]+=((sz[x]-1)*(sz[x]-1)); dp[y]+=((sz[y]-1)*(sz[y]-1)); dp[y]-=(sz[x]*sz[x]); } void dfs_(int x,int p=-1) { vis[x]=1; ans+=dp[x]; for(auto y:ma[x]) { if(y!=p) { ChangeRoot(x,y); dfs_(y,x); ChangeRoot(y,x); } } } bool cycle=0; int nodes=0; void _dfs(int x,int p=-1) { vis[x]=1; nodes++; for(auto y:ma[x]) { if(y!=p) { if(vis[y]) { cycle=1; } else { _dfs(y,x); } } } } int f_cyc(int x) { return (x*(x-1)*(x-2)); } // int f_lin(int x) // { // ll cur=(x-1)*(x-1)*(x-1); // return cur-(pre[x-1]); // } int f_lin_brute(int x) { ll ans=0; ll sp=(x-1)*(x-1); for(int j=1;j<=x;j++) ans+=(sp-((j-1)*(j-1))-((x-j)*(x-j))); return ans; } bool senpai[51][51][51]; vector<int> path; void full(int x) { vis[x]=1; for(auto y:ma[x]) { if(!vis[y]) { path.push_back(y); full(y); path.pop_back(); } } for(int i=1;(i+1)<path.size();i++) senpai[path[0]][path[i]][path.back()]=1; vis[x]=0; } void solve() { // int n,m; // cin>>n; // // m=n-1; int n,m; cin>>n>>m; vector<int> deg(n+2); for(int i=0;i<m;i++) { int x=i+1,y=i+2; cin>>x>>y; deg[x]++; deg[y]++; ma[x].push_back(y); ma[y].push_back(x); } int mx=0; for(int i=1;i<=n;i++) mx=max(mx,deg[i]); if(n<=50) { for(int i=1;i<=n;i++) { path.push_back(i); full(i); path.pop_back(); } for(int a=1;a<=n;a++) for(int b=1;b<=n;b++) for(int c=1;c<=n;c++) ans+=senpai[a][b][c]; } else if(mx<=2) { // Solve a Cycle or a Path for(int i=1;i<=n;i++) { if(!vis[i]) { cycle=0; nodes=0; _dfs(i); if(cycle) { ans+=f_cyc(nodes); } else { ans+=f_lin_brute(nodes); } } } } else { // Solve on Tree for(int i=1;i<=n;i++) { if(!vis[i]) { dfs(i); } } for(int i=1;i<=n;i++) vis[i]=0; for(int i=1;i<=n;i++) { if(!vis[i]) { dfs_(i); } } } cout<<ans<<'\n'; } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); // pre[0]=0; // ll asp=1e5+1; // for(int i=1;i<=asp;i++) // pre[i]=pre[i-1]+(i*i); solve(); }

Compilation message (stderr)

count_triplets.cpp: In function 'void full(long long int)':
count_triplets.cpp:103:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |  for(int i=1;(i+1)<path.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...