Submission #917382

#TimeUsernameProblemLanguageResultExecution timeMemory
917382abcvuitunggioBeech Tree (IOI23_beechtree)C++17
9 / 100
2077 ms37628 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; } 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=0;i<n;i++) for (int j=i+1;j<n;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]){ if (!i) dp[i][j]=1; else if (C[i]==C[j]) dp[i][j]=dp[P[i]][P[j]]; } if (dp[i][j]<0&&!i) bad[0]=1; if (dp[i][j]&&dp[i][j]==-dp[P[i]][P[j]]){ int l=lca(i,j); if (l!=i) bad[l]=1; else bad[P[l]]=1; } } dfs(0); for (int i=0;i<n;i++) res.push_back(bad[i]^1); return res; }

Compilation message (stderr)

beechtree.cpp: In function 'std::vector<int> beechtree(int, int, std::vector<int>, std::vector<int>)':
beechtree.cpp:36: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]
   36 |         for (int j=1;j<ke[i].size();j++)
      |                      ~^~~~~~~~~~~~~
beechtree.cpp:56: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]
   56 |             if (cnt!=ke[u].size()){
      |                 ~~~^~~~~~~~~~~~~~
#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...