Submission #891522

#TimeUsernameProblemLanguageResultExecution timeMemory
891522Faisal_SaqibSplit the Attractions (IOI19_split)C++17
0 / 100
2 ms6492 KiB
#include <vector> #include <set> #include <algorithm> #include <iostream> 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]; } } } 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]); p.push_back(q[j]); q.push_back(p[j]); } long long tp=n; tp*=(long long)m; if(tp<=(2e8)) { for(int j=0;j<p.size();j++) { for(int i=1;i<=n;i++) { vis[i]=0; } vis[q[j]]=1; take(p[j],a,0); take(q[j],b,1); if(one.size()==a and two.size()==b) { asd=1; break; } } 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; } 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:31:16: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   31 |   if(two.size()<cnt)
      |      ~~~~~~~~~~^~~~
split.cpp:38:16: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   38 |   if(one.size()<cnt)
      |      ~~~~~~~~~~^~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:131:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  131 |   for(int j=0;j<p.size();j++)
      |               ~^~~~~~~~~
split.cpp:140:17: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  140 |    if(one.size()==a and two.size()==b)
      |       ~~~~~~~~~~^~~
split.cpp:140:35: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  140 |    if(one.size()==a and 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...