Submission #912649

#TimeUsernameProblemLanguageResultExecution timeMemory
912649WansurSplit the Attractions (IOI19_split)C++14
40 / 100
93 ms35664 KiB
#include <bits/stdc++.h> #define f first #define s second #define ent '\n' using namespace std; typedef long long ll; const int mx=2e5+12; vector<pair<int,int>> del; vector<pair<int,int>> add; vector<int> ans; pair<int,int> fup[mx]; vector<int> g[mx]; set<int> e[mx]; int Ans[mx]; int par[mx]; int tin[mx]; int ver[mx]; int sz[mx]; int pos[]={1,2,3}; int timer; void calc(int v){ sz[v]=1; for(int to:g[v]){ if(sz[to]>0)continue; calc(to); par[to]=v; e[v].insert(to); sz[v]+=sz[to]; } } void dfs(int v,int p){ tin[v]=fup[v].f=++timer; fup[v].s=v; ver[tin[v]]=v; for(int to:g[v]){ if(to==p)continue; if(tin[to]>0){ fup[v]=min(fup[v],{tin[to],v}); } else{ dfs(to,v); fup[v]=min(fup[v],fup[to]); } } } void get(int v,int p,int &cnt,int t){ if(!cnt)return; Ans[v]=pos[t]; cnt--; if(!cnt)return; for(int to:e[v]){ get(to,v,cnt,t); } } void get(int v,int n,int a,int b,int c){ vector<int> edg; for(int to:e[v]){ edg.push_back(to); } int s=sz[v]; for(int to:edg){ if(s-sz[to]<a){ break; } if(fup[to].f<tin[v]){ s-=sz[to]; e[v].erase(to); add.push_back({v,to}); e[ver[fup[to].f]].insert(fup[to].s); del.push_back({ver[fup[to].f],fup[to].s}); } } e[par[v]].erase(v); add.push_back({par[v],v}); if(s>=a && n-s>=b){ get(v,0,a,0); get(0,0,b,1); for(int i=0;i<n;i++){ ans[i]=Ans[i]; if(!ans[i])ans[i]=pos[2]; } } else if(s>=b && n-s>=a){ get(v,0,b,1); get(0,0,a,0); for(int i=0;i<n;i++){ ans[i]=Ans[i]; if(!ans[i])ans[i]=pos[2]; } } } std::vector<int> find_split(int n, int a, int b, int c, std::vector<int> p, std::vector<int> q){ for(int i=0;i<p.size();i++){ g[p[i]].push_back(q[i]); g[q[i]].push_back(p[i]); } if(a>b){ swap(a,b); swap(pos[0],pos[1]); } if(a>c){ swap(a,c); swap(pos[0],pos[2]); } if(b>c){ swap(b,c); swap(pos[1],pos[2]); } calc(0); int v=-1; vector<int> d; for(int i=0;i<n;i++){ ans.push_back(0); } for(int i=1;i<n;i++){ if(sz[i]<a)continue; if(sz[i]>=a){ d.push_back(i); } } sort(d.begin(),d.end(),[](int i,int j){ return sz[i]<sz[j]; }); for(int v:d){ del.clear(); add.clear(); get(v,n,a,b,c); if(ans[0]!=0)return ans; for(auto x:del){ e[x.f].erase(x.s); } for(auto x:add){ e[x.f].insert(x.s); } } 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:100:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |  for(int i=0;i<p.size();i++){
      |              ~^~~~~~~~~
split.cpp:117:6: warning: unused variable 'v' [-Wunused-variable]
  117 |  int v=-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...