Submission #922703

#TimeUsernameProblemLanguageResultExecution timeMemory
922703abcvuitunggioBeech Tree (IOI23_beechtree)C++17
0 / 100
91 ms64020 KiB
#include "beechtree.h" #include <bits/stdc++.h> using namespace std; int n,m,bad[200001],d[200001],p[200001][20],dp[2001][2001],ch[200001]; vector <pair <int, int>> ke[200001]; vector <int> res; void dfs(int u){ for (auto [c,v]:ke[u]){ dfs(v); bad[u]|=bad[v]; } } int lca(int u, int v){ u++,v++; if (d[u]<d[v]) swap(u,v); int x=d[u]-d[v]; for (int i=0;i<20;i++) if ((x>>i)&1) u=p[u][i]; if (u==v) return u-1; for (int i=19;i>=0;i--) if (p[u][i]!=p[v][i]){ u=p[u][i]; v=p[v][i]; } return p[u][0]-1; } void dfs2(int u){ for (auto [c,v]:ke[u]){ dfs2(v); cout << u << ' ' << v << ' ' << c << '\n'; } } vector <int> beechtree(int N, int M, vector<int> P, vector<int> C){ n=N,m=M; for (int i=1;i<n;i++) ke[P[i]].push_back({C[i],i}); for (int i=0;i<n;i++){ sort(ke[i].begin(),ke[i].end()); for (int j=1;j<ke[i].size();j++) if (ke[i][j].first==ke[i][j-1].first) bad[i]=1; p[i+1][0]=P[i]+1; d[i+1]=d[P[i]+1]+1; for (int j=1;j<20;j++) p[i+1][j]=p[p[i+1][j-1]][j-1]; } for (int i=n-1;i>=0;i--) for (int j=n-1;j>i;j--){ int u=i,v=j; if (ke[i].size()>ke[j].size()) swap(u,v); for (auto [c,k]:ke[u]) ch[c]=1; int cnt=0; for (auto [c,k]:ke[v]) cnt+=ch[c]; for (auto [c,k]:ke[u]) ch[c]=0; if (cnt!=ke[u].size()){ bad[lca(i,j)]=1; continue; } dp[i][j]=(ke[i].size()>ke[j].size()?1:(ke[i].size()<ke[j].size()?-1:0)); if (!dp[i][j]) for (int k=0;k<ke[i].size();k++){ int u=ke[i][k].second,v=ke[j][k].second,ch=1; if (dp[u][v]) dp[i][j]=dp[u][v]; } dp[j][i]=-dp[i][j]; } for (int i=1;i<n;i++) for (int j=i+1;j<n;j++) if (dp[i][j]*dp[P[i]][P[j]]==-1) bad[lca(P[i],P[j])]=1; for (int i=1;i<n;i++) if (dp[0][i]<0) bad[0]=1; dfs(0); for (int i=0;i<n;i++) res.push_back(bad[i]^1); dfs2(79); return res; }

Compilation message (stderr)

beechtree.cpp: In function 'std::vector<int> beechtree(int, int, std::vector<int>, std::vector<int>)':
beechtree.cpp:42:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |         for (int j=1;j<ke[i].size();j++)
      |                      ~^~~~~~~~~~~~~
beechtree.cpp:62:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |             if (cnt!=ke[u].size()){
      |                 ~~~^~~~~~~~~~~~~~
beechtree.cpp:68:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |                 for (int k=0;k<ke[i].size();k++){
      |                              ~^~~~~~~~~~~~~
beechtree.cpp:69:61: warning: unused variable 'ch' [-Wunused-variable]
   69 |                     int u=ke[i][k].second,v=ke[j][k].second,ch=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...
#Verdict Execution timeMemoryGrader output
Fetching results...