제출 #1068181

#제출 시각아이디문제언어결과실행 시간메모리
1068181LittleOrangeSplit the Attractions (IOI19_split)C++17
18 / 100
54 ms12368 KiB
#include "split.h"

#include<bits/stdc++.h>
using namespace std;
using ll = int;

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<vector<ll>> con(n);
	ll m = p.size();
	for(ll i = 0;i<m;i++){
		con[p[i]].push_back(q[i]);
		con[q[i]].push_back(p[i]);
	}
	ll mxd = 0;
	for(auto &o : con) mxd = max(mxd,(ll)o.size());
	if (mxd==2){
		ll st = 0;
		for(ll i = 0;i<n;i++) if(con[i].size()==1) st = i;
		vector<ll> v(1,st);
		vector<ll> u(n,0);
		u[st] = 1;
		while(v.size()<n){
			for(ll i : con[st]) if(!u[i]){
				u[i] = 1;
				v.push_back(i);
				st = i;
				break;
			}
		}
		vector<ll> ret(n,0);
		for(ll i = 0;i<a;i++) ret[v[i]] = 1;
		for(ll i = a;i<a+b;i++) ret[v[i]] = 2;
		for(ll i = a+b;i<a+b+c;i++) ret[v[i]] = 3;
		return ret;
	}
	if (a==1){
		vector<ll> r(n,0);
		function<void(ll)> dfs;
		dfs = [&](ll i){
			if (r[i]||b==0) return;
			r[i] = 2;
			b--;
			for(ll j : con[i]){
				dfs(j);
			}
		};
		dfs(0);
		for(ll i = 0;i<n;i++)if(!r[i]){
			if (a){
				a=0;
				r[i] = 1;
			}else r[i] = 3;
		}
		return r;
	}
	vector<array<ll,2>> abc = {{a,1},{b,2},{c,3}};
	sort(abc.begin(),abc.end());
	if(m==n-1){
		vector<ll> c1(n,-1),c2(n,-1),s(n,1),P(n,-1);
		function<void(ll,ll)> dfs;
		dfs = [&](ll i,ll p){
			P[i] = p;
			for(ll j : con[i])if(j!=p) {
				dfs(j,i);
				s[i]+=s[j];
			}
			if (s[i]>=abc[0][0]) c1[i] = 0;
			if (s[i]>=abc[1][0]) c2[i] = 0;
			for(ll j : con[i])if(j!=p) {
				if (c1[j]>=0) c1[i] = max(c1[i],c1[j]+s[i]-s[j]);
				if (c2[j]>=0) c2[i] = max(c2[i],c2[j]+s[i]-s[j]);
			}
		};
		dfs(0,-1);
		//for(ll i = 0;i<n;i++) cerr << c1[i] << " \n"[i+1==n];
		//for(ll i = 0;i<n;i++) cerr << c2[i] << " \n"[i+1==n];
		vector<ll> res(n,0);
		if (c1[0]<abc[1][0]&&c2[0]<abc[0][0]) return res;
		//cerr << "sus\n";
		function<void(ll,ll)> draw;
		draw = [&](ll i, ll t){
			for(ll j : con[i])if(j!=P[i]) draw(j,t);
			if (abc[t][0]==0||res[i]) return;
			abc[t][0]--;
			res[i] = abc[t][1];
		};
		if (c1[0]>=abc[1][0]){
			function<ll(ll)> fd;
			fd = [&](ll i){
				if (c1[i]==0) return i;
				for(ll j : con[i])if(j!=P[i]&&c1[j]+s[i]-s[j]==c1[i]) {
					return fd(j);
				}
			};
			ll x = fd(0);
			draw(x,0);
			draw(0,1);
		}else{
			function<ll(ll)> fd;
			fd = [&](ll i){
				if (c2[i]==0) return i;
				for(ll j : con[i])if(j!=P[i]&&c2[j]+s[i]-s[j]==c2[i]) {
					return fd(j);
				}
			};
			ll x = fd(0);
			draw(x,1);
			draw(0,0);
		}
		for(ll i = 0;i<n;i++) if(res[i]==0) res[i] = abc[2][1];
		return res;
	}
	vector<int> res(n,0);
	/*if (n == 9) {
		res = {1, 1, 3, 1, 2, 2, 3, 1, 3};
	} else {
		res = {0, 0, 0, 0, 0, 0};
	}*/
	return res;
}

컴파일 시 표준 에러 (stderr) 메시지

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:22:17: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   22 |   while(v.size()<n){
      |         ~~~~~~~~^~
split.cpp: In lambda function:
split.cpp:94:4: warning: control reaches end of non-void function [-Wreturn-type]
   94 |    };
      |    ^
split.cpp: In lambda function:
split.cpp:105:4: warning: control reaches end of non-void function [-Wreturn-type]
  105 |    };
      |    ^
#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...