Submission #1035498

#TimeUsernameProblemLanguageResultExecution timeMemory
1035498AbitoSplit the Attractions (IOI19_split)C++17
0 / 100
578 ms1048576 KiB
#include "split.h" #include <bits/stdc++.h> #define pb push_back #define F first #define S second using namespace std; const int N=2e5+5; int n,a,b,c,sz[N],tin[N],t,mn,tree[N],h[3]={1,2,3},bh; vector<int> adj[N],v,ans,A,B,C; pair<int,int> bs[N]; bool vis[N]; bool cmp(int x,int y){ int hx,hy; if (x==1) hx=a; if (x==2) hx=b; if (x==3) hx=c; if (y==1) hy=a; if (y==2) hy=b; if (y==3) hy=c; return hx<hy; } int getsz(int x,int p){ sz[x]=1; for (auto u:adj[x]) if (u!=p) sz[x]+=getsz(u,x); return sz[x]; } void dfs(int x,int p){ tin[x]=++t; sz[x]=1; tree[t]=x; for (auto u:adj[x]){ if (u==p) continue; dfs(u,x); sz[u]+=sz[x]; } return; } void getb(int x,int p){ bh--; ans[x-1]=h[1]; if (!bh) return; for (auto u:adj[x]){ if (u==p || ans[u-1]) continue; getb(u,x); }return; } vector<int> find_split(int NN,int aa,int bb,int cc,vector<int> Q,vector<int> P){ n=NN,a=aa,b=bb,c=cc; mn=min(min(a,b),c); for (int i=0;i<Q.size();i++){ int x=Q[i]+1,y=P[i]+1; adj[x].pb(y); adj[y].pb(x); } for (int i=0;i<n;i++) ans.pb(0); getsz(1,0); vector<int> best={n,1,1}; for (int i=1;i<=n;i++){ bs[i]={n,1}; if (sz[i]>=mn) bs[i]={sz[i],1}; for (auto u:adj[i]){ if (sz[u]>sz[i]) continue; if (n-sz[u]>=mn) bs[i]=min(bs[i],{n-sz[u],u}); } best=min(best,{bs[i].F,bs[i].S,i}); } if (best[0]==n) return ans; sort(h,h+3,cmp); dfs(best[1],0); for (int i=tin[best[2]];i<=tin[best[2]]+mn-1;i++) ans[tree[i]-1]=h[0]; if (h[1]==1) bh=a; if (h[1]==2) bh=b; if (h[1]==3) bh=c; if (!ans[0]) getb(best[1],0); for (int i=0;i<n;i++) if (!ans[i]) ans[i]=h[2]; for (int i=0;i<n;i++){ if (ans[i]==1) a--; if (ans[i]==2) b--; if (ans[i]==3) c--; } if (a || b || c){ for (int i=0;i<n;i++) ans[i]=0; } return ans; }

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:50:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for (int i=0;i<Q.size();i++){
      |                  ~^~~~~~~~~
split.cpp: In function 'bool cmp(int, int)':
split.cpp:20:15: warning: 'hy' may be used uninitialized in this function [-Wmaybe-uninitialized]
   20 |     return hx<hy;
      |               ^~
split.cpp:20:15: warning: 'hx' may be used uninitialized in this function [-Wmaybe-uninitialized]
#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...