Submission #912669

#TimeUsernameProblemLanguageResultExecution timeMemory
912669WansurSplit the Attractions (IOI19_split)C++14
100 / 100
204 ms43860 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; 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); e[to].insert(v); 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]){ if(to!=p)get(to,v,cnt,t); } } 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]); } int A=a,B=b,C=c; calc(0); dfs(0,0); int v=-1; for(int i=0;i<n;i++){ } for(int i=1;i<n;i++){ if(sz[i]<a)continue; bool ok=1; for(int to:e[i]){ if(sz[to]>=a && tin[to]>tin[i])ok=0; } if(ok){ v=i; break; } } vector<int> ans(n); if(v<0)return ans; bool bad=0; vector<int> edg; for(int to:e[v]){ if(tin[to]>tin[v])edg.push_back(to); } for(int to:edg){ if(sz[v]-sz[to]<a){ break; } if(fup[to].f<tin[v]){ sz[v]-=sz[to]; e[v].erase(to); e[to].erase(v); e[ver[fup[to].f]].insert(fup[to].s); e[fup[to].s].insert(ver[fup[to].f]); } } e[par[v]].erase(v); e[v].erase(par[v]); if(sz[v]>=a && n-sz[v]>=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(sz[v]>=b && n-sz[v]>=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]; } } 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:60:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |  for(int i=0;i<p.size();i++){
      |              ~^~~~~~~~~
split.cpp:76:6: warning: unused variable 'A' [-Wunused-variable]
   76 |  int A=a,B=b,C=c;
      |      ^
split.cpp:76:10: warning: unused variable 'B' [-Wunused-variable]
   76 |  int A=a,B=b,C=c;
      |          ^
split.cpp:76:14: warning: unused variable 'C' [-Wunused-variable]
   76 |  int A=a,B=b,C=c;
      |              ^
split.cpp:95:7: warning: unused variable 'bad' [-Wunused-variable]
   95 |  bool bad=0;
      |       ^~~
#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...