Submission #891511

#TimeUsernameProblemLanguageResultExecution timeMemory
891511Faisal_SaqibSplit the Attractions (IOI19_split)C++17
40 / 100
71 ms25036 KiB
#include <vector> #include <set> #include <algorithm> using namespace std; const int N=2e5+1; vector<int> ma[N]; int color[N],sz[N]; bool vis[N]; set<int> one,two; int n; void dfs_sz(int x,int p=-1) { vis[x]=1; sz[x]=1; for(auto y:ma[x]) { if(!vis[y]) { dfs_sz(y,x); sz[x]+=sz[y]; } } } bool asd=0; void take(int x,int cnt,bool sp) { vis[x]=1; if(sp) { if(two.size()<cnt) { two.insert(x); } } else { if(one.size()<cnt) { one.insert(x); } } for(auto y:ma[x]) { if(!vis[y]) { take(y,cnt,sp); } } } void find_edge(int x,int a,int b,int p=-1) { vis[x]=1; if(asd) return; for(auto y:ma[x]) { if(!vis[y]) { if(asd) { return; } if(sz[y]>=b and (n-sz[y])>=a) { one.clear(); two.clear(); for(int i=1;i<=n;i++) vis[i]=0; vis[x]=1; take(y,b,1); for(int i=1;i<=n;i++) vis[i]=0; vis[y]=1; take(x,a,0); asd=1; return; } if(sz[y]>=a and (n-sz[y])>=b) { one.clear(); two.clear(); for(int i=1;i<=n;i++) vis[i]=0; vis[x]=1; take(y,a,0); for(int i=1;i<=n;i++) vis[i]=0; vis[y]=1; take(x,b,1); asd=1; return; } sz[x]-=sz[y]; sz[y]+=sz[x]; find_edge(y,a,b,x); sz[y]-=sz[x]; sz[x]+=sz[y]; } } } void dfs(int x,int a,int b) { if(one.size()<a) { one.insert(x); } else if(two.size()<b) { two.insert(x); } vis[x]=1; for(auto y:ma[x]) { if(!vis[y]) { dfs(y,a,b); } } } vector<int> find_split(int n1, int a, int b, int c, vector<int> p, vector<int> q) { n=n1; vector<pair<int,int>> aps; aps.push_back({a,1}); aps.push_back({b,2}); aps.push_back({c,3}); sort(begin(aps),end(aps)); int colora,colorb,colorc; a=aps[0].first; colora=aps[0].second; b=aps[1].first; colorb=aps[1].second; c=aps[2].first; colorc=aps[2].second; int m=p.size(); for(int j=0;j<m;j++) { p[j]++; q[j]++; ma[p[j]].push_back(q[j]); ma[q[j]].push_back(p[j]); } dfs_sz(1); for(int i=1;i<=n;i++) { vis[i]=0; } find_edge(1,a,b); for(int i=1;i<=n;i++) { color[i]=colorc; } for(auto i:one) { color[i]=colora; } for(auto i:two) { color[i]=colorb; } vector<int> ans; for(int i=1;i<=n;i++) { if(!asd) { ans.push_back(0); } else ans.push_back(color[i]); } return ans; }

Compilation message (stderr)

split.cpp: In function 'void take(int, int, bool)':
split.cpp:30:16: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   30 |   if(two.size()<cnt)
      |      ~~~~~~~~~~^~~~
split.cpp:37:16: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   37 |   if(one.size()<cnt)
      |      ~~~~~~~~~~^~~~
split.cpp: In function 'void dfs(int, int, int)':
split.cpp:103:15: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  103 |  if(one.size()<a)
      |     ~~~~~~~~~~^~
split.cpp:107:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  107 |  else if(two.size()<b)
      |          ~~~~~~~~~~^~
#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...