Submission #292489

#TimeUsernameProblemLanguageResultExecution timeMemory
292489AutoratchSplit the Attractions (IOI19_split)C++14
18 / 100
2075 ms15512 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; const int N = 1e5; int n,a,b,c; int mn1 = INT_MAX,mn2 = INT_MAX,id1,id2; vector<int> adj[N]; vector<int> sq; int sz[N],sf = -1,ty = -1,pa[N],st; bool visited[N]; void get(int u,int p){ sz[u] = 1; visited[u] = true; for(int v : adj[u]) if(v!=p and !visited[v]) get(v,u),sz[u]+=sz[v]; } void dfs(int u,int p) { if(visited[u]) return; pa[u] = p; visited[u] = true; sq.push_back(u); if(sz[u]>=mn1 and n-sz[u]>=mn2) sf = u,ty = 1; if(sz[u]>=mn2 and n-sz[u]>=mn1) sf = u,ty = 2; for(int v : adj[u]) if(v!=p) dfs(v,u); } void dv(int u,int p) { if(u==sf) return; if(visited[u]) return; visited[u] = true; sq.push_back(u); for(int v : adj[u]) if(v!=p) dv(v,u); } vector<int> find_split(int _n,int _a,int _b,int _c,vector<int> p,vector<int> q) { n = _n,a = _a,b = _b,c = _c; if(a<mn1) mn1 = a,id1 = 1; if(b<mn1) mn1 = b,id1 = 2; if(c<mn1) mn1 = c,id1 = 3; if(a<mn2 and id1!=1) mn2 = a,id2 = 1; if(b<mn2 and id1!=2) mn2 = b,id2 = 2; if(c<mn2 and id1!=3) mn2 = c,id2 = 3; for(int i = 0;i < p.size();i++) { int a = p[i],b = q[i]; adj[a].push_back(b),adj[b].push_back(a); } for(int i = 0;i < n;i++) { get(i,-1); for(int j = 0;j < n;j++) visited[j] = false; dfs(i,-1); for(int j = 0;j < n;j++) visited[j] = false; sq.clear(); if(sf!=-1){ st = i; break; } } vector<int> res(n); if(sf==-1) return res; sq.clear(); dfs(sf,pa[sf]); for(int i = 0;i < n;i++) visited[i] = false; if(ty==1) for(int i = 0;i < mn1;i++) res[sq[i]] = id1; else for(int i = 0;i < mn2;i++) res[sq[i]] = id2; sq.clear(); dv(st,-1); if(ty==1) for(int i = 0;i < mn2;i++) res[sq[i]] = id2; else for(int i = 0;i < mn1;i++) res[sq[i]] = id1; for(int i = 0;i < n;i++) if(!res[i]) res[i] = 6-id1-id2; int ca = 0,cb = 0,cc = 0; for(int i = 0;i < n;i++) if(res[i]==1) ca++; else if(res[i]==2) cb++; else cc++; assert(ca==a and cb==b and cc==c); return res; }

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:45:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for(int i = 0;i < p.size();i++)
      |                   ~~^~~~~~~~~~
#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...