Submission #912643

#TimeUsernameProblemLanguageResultExecution timeMemory
912643WansurSplit the Attractions (IOI19_split)C++14
40 / 100
144 ms35300 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]; vector<int> ord; 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 caalc(int v,int p){ ord.push_back(v); sz[v]=1; for(int to:e[v]){ if(to!=p){ sz[v]+=sz[to]; caalc(to,v); } } } void get(int v,int x,int c){ ord.clear(); caalc(v,0); sort(ord.begin(),ord.end(),[](int i,int j){ return sz[i]>sz[j]; }); for(int x:ord){ Ans[x]=pos[c]; } while(ord.size()>x){ Ans[ord.back()]=pos[2]; ord.pop_back(); } } 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); int v=-1; for(int i=1;i<n;i++){ if(sz[i]<a)continue; bool ok=1; for(int to:e[i]){ if(sz[to]>=a)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]){ edg.push_back(to); } for(int to:edg){ if(sz[v]-sz[to]<a){ e[par[v]].erase(v); get(v,a,0); get(0,b,1); int c=0; for(int i=0;i<n;i++){ ans[i]=Ans[i]; if(ans[i]==pos[0])c++; if(!ans[i])ans[i]=pos[2]; } return ans; continue; } if(fup[to].f<tin[v]){ sz[v]-=sz[to]; e[v].erase(to); e[ver[fup[to].f]].insert(fup[to].s); } } e[par[v]].erase(v); if(n-sz[v]>=b){ get(v,a,0); get(0,b,1); for(int i=0;i<n;i++){ ans[i]=Ans[i]; if(!ans[i])ans[i]=pos[2]; } } else if(n-sz[v]>=a){ get(v,b,1); get(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 'void get(int, int, int)':
split.cpp:69:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   69 |  while(ord.size()>x){
      |        ~~~~~~~~~~^~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:76:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |  for(int i=0;i<p.size();i++){
      |              ~^~~~~~~~~
split.cpp:92:6: warning: unused variable 'A' [-Wunused-variable]
   92 |  int A=a,B=b,C=c;
      |      ^
split.cpp:92:10: warning: unused variable 'B' [-Wunused-variable]
   92 |  int A=a,B=b,C=c;
      |          ^
split.cpp:92:14: warning: unused variable 'C' [-Wunused-variable]
   92 |  int A=a,B=b,C=c;
      |              ^
split.cpp:108:7: warning: unused variable 'bad' [-Wunused-variable]
  108 |  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...