Submission #299899

#TimeUsernameProblemLanguageResultExecution timeMemory
299899dsjongSplit the Attractions (IOI19_split)C++14
0 / 100
100 ms9976 KiB
#include "split.h"
#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
vector<int>adj[100005];
int par[100005], sum[100005], ans[100005];
pii A, B;
bool done=false;
int cnter, bad, n;
void go(int x, int p, int v){
	if(cnter && !ans[x]){
		cnter--;
		ans[x]=v;
	}
	for(int y:adj[x]){
		if(y==p) continue;
		go(y, x, v);
	}
}
void dfs(int x, int p){
	par[x]=p;
	sum[x]=1;
	vector<pair<int, int>>cur;
	for(int y:adj[x]){
		if(y==p) continue;
		dfs(y, x);
		sum[x]+=sum[y];
		cur.push_back({sum[y], y});
	}
	cur.push_back({n-sum[x], 0});
	sort(cur.rbegin(), cur.rend());
	if(cur.size()==1) return;
	if(cur[0].first >= B.first && cur[1].first >= A.first && !done){
		/*cout<<x<<" "<<cur.size()<<endl;
		for(auto [x, y]:cur){
			cout<<x<<" "<<y<<endl;
		}*/
		done=true;
		cnter=B.first;
		if(cur[0].second!=0) go(cur[0].second, par[cur[0].second], B.second);
		cnter=A.first;
		go(cur[1].second, par[cur[1].second], A.second);
		cnter=B.first;
		if(cur[0].second==0) go(cur[0].second, par[cur[0].second], B.second);
		for(int i=0;i<n;i++){
			if(!ans[i]) ans[i]=bad;
		}
	}
}
vector<int> find_split(int _n, int a, int b, int c, vector<int> p, vector<int> q) {
	n=_n;
	assert((int) p.size()==n-1);
	for(int i=0;i<p.size();i++){
		int x=p[i], y=q[i];
		adj[x].push_back(y);
		adj[y].push_back(x);
	}
	vector<pii>v={{a, 1}, {b, 2}, {c, 3}};
	sort(v.begin(), v.end());
	A=v[0], B=v[1], bad=v[2].second;
	dfs(0, -1);
	vector<int>fans;
	for(int i=0;i<n;i++){
		fans.push_back(ans[i]);
	}
	return fans;
}

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:53:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |  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...