Submission #316448

#TimeUsernameProblemLanguageResultExecution timeMemory
316448juggernautSplit the Attractions (IOI19_split)C++14
40 / 100
2075 ms14332 KiB
#include<bits/stdc++.h> #include"split.h" using namespace std; vector<int>g[100005]; int ans[100005],b; pair<int,int>p[3]; int sz[100005],n; int fir(int v,int p){ for(int to:g[v])if(to!=p)return fir(to,v); return v; } void dfs(int v){ if(!b)return; b--; ans[v]=2; for(int to:g[v])if(!ans[to])dfs(to); } int calc(int v,int p){ sz[v]=1; for(int to:g[v])if(to!=p)sz[v]+=calc(to,v); return sz[v]; } int dfs(int v,int p){ for(int to:g[v])if(to!=p) if(sz[to]>(n>>1))return dfs(to,v); return v; } bool cmp(int l,int r){ return sz[l]>sz[r]; } vector<int>zero(int n){ vector<int>ans; while(n--)ans.push_back(0); return ans; } void go(int v,int par,int cnt,int val){ if(!p[cnt].first)return; ans[v]=val; p[cnt].first--; for(int to:g[v])if(to!=par) go(to,v,cnt,val); } vector<int>find_split(int N,int a,int B,int c,vector<int>p1,vector<int>p2){ b=B;n=N; if(a==1){ for(int i=0;i<p1.size();i++){ g[p1[i]].push_back(p2[i]); g[p2[i]].push_back(p1[i]); } dfs(0); vector<int>res; for(int i=0;i<n;i++){ if(!ans[i]){ if(a){ a--; ans[i]=1; }else ans[i]=3; } res.push_back(ans[i]); } return res;}else if((int)p1.size()==n-1){ p[0]={a,1}; p[1]={b,2}; p[2]={c,3}; sort(p,p+3); for(int i=0;i<p1.size();i++){ g[p1[i]].push_back(p2[i]); g[p2[i]].push_back(p1[i]); } calc(1,-1); int root=dfs(1,-1); calc(root,-1); sort(g[root].begin(),g[root].end(),cmp); if(sz[g[root][0]]<p[0].first)return zero(n); go(g[root][0],root,0,p[0].second); p[1].first--; ans[root]=p[1].second; for(int i=1;i<g[root].size();i++)go(g[root][i],root,1,p[1].second); vector<int>vec; for(int i=0;i<n;i++){ if(!ans[i])ans[i]=p[2].second; vec.push_back(ans[i]); } return vec; }else{ int root=0; for(int i=0;i<p1.size();i++){ g[p1[i]].push_back(p2[i]); g[p2[i]].push_back(p1[i]); } if(p1.size()!=n)root=fir(root,-1); while(a--){ ans[root]=1; for(int to:g[root])if(!ans[to])root=to; } while(b--){ ans[root]=2; for(int to:g[root])if(!ans[to])root=to; } while(c--){ ans[root]=3; for(int to:g[root])if(!ans[to])root=to; } vector<int>res; for(int i=0;i<n;i++)res.push_back(ans[i]); return res; } }

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:46:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |     for(int i=0;i<p1.size();i++){
      |                 ~^~~~~~~~~~
split.cpp:67:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for(int i=0;i<p1.size();i++){
      |                 ~^~~~~~~~~~
split.cpp:79:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |     for(int i=1;i<g[root].size();i++)go(g[root][i],root,1,p[1].second);
      |                 ~^~~~~~~~~~~~~~~
split.cpp:88:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |     for(int i=0;i<p1.size();i++){
      |                 ~^~~~~~~~~~
split.cpp:92:17: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   92 |     if(p1.size()!=n)root=fir(root,-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...