제출 #602268

#제출 시각아이디문제언어결과실행 시간메모리
602268chirathnirodhaSplit the Attractions (IOI19_split)C++17
0 / 100
490 ms1048576 KiB
#include "split.h"
#include<bits/stdc++.h>
using namespace std;
#define PB push_back
#define MP make_pair
#define F first
#define S second
#define P push 
#define I insert
vector<int> edges[200000];
int n,m,a,b,c;
int parent[200000];
int subsiz[200000];
vector<int> ans;
void dfs(int x){
	subsiz[x]=1;
	for(int i=0;i<edges[x].size();i++){
		int y=edges[x][i];
		if(y==parent[x])continue;
		parent[y]=x;
		dfs(y);
		subsiz[x]+=subsiz[y];
	}
}
void colouring(int toall,int nd,int ucol, int unum,int dcol,int dnum){
	for(int i=0;i<n;i++)ans[i]=toall;
	queue<int> q;q.P(nd);
	while(!q.empty() && dnum>0){
		int cur=q.front();q.pop();
		ans[cur]=dcol;dnum--;
		for(int i=0;i<edges[cur].size();i++){
			int y=edges[cur][i];
			if(y==parent[nd])continue;
			q.P(y);
		}
	}
	queue<int> q1;q1.P(parent[nd]);
	while(!q1.empty() && unum>0){
		int cur=q1.front();q1.pop();
		ans[cur]=ucol;unum--;
		for(int i=0;i<edges[cur].size();i++){
			int y=edges[cur][i];
			if(y==nd)continue;
			q1.P(y);
		}
	}
}
void Subtask_1_3(){
  	parent[0]=0;
	dfs(0);
	for(int i=0;i<n;i++){
		if(subsiz[i]>=a){
			if(subsiz[i]-a<=b){colouring(3,i,2,b,1,a);break;}
			if(subsiz[i]-a<=c){colouring(2,i,3,c,1,a);break;}
		}
		if(subsiz[i]>=b){
			if(subsiz[i]-b<=a){colouring(3,i,1,a,2,b);break;}
			if(subsiz[i]-b<=c){colouring(1,i,3,c,2,b);break;}
		}
		if(subsiz[i]>=c){
			if(subsiz[i]-c<=b){colouring(1,i,2,b,3,c);break;}
			if(subsiz[i]-c<=a){colouring(2,i,1,a,3,c);break;}
		}
	}
	return;
}
void Subtask_2(){
	bool visited[n];memset(visited,false,sizeof(visited));
	queue<int> q;q.P(0);
	for(int i=0;i<n;i++)ans[i]=3;
	while(!q.empty() && b>0){
		int cur=q.front();q.pop();
		for(int i=0;i<edges[cur].size();i++){
			int y=edges[cur][i];
			if(b<=0)break;
			if(visited[y])continue;
			visited[y]=true;
			ans[y]=2;b--;
			q.P(y);
		}
	}
	for(int i=0;i<n;i++)if(visited[i]==false){ans[i]=1;break;}
	return;
}
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;m=p.size();
	for(int i=0;i<n;i++)ans.PB(0);
	for(int i=0;i<m;i++){
		edges[p[i]].PB(q[i]);
		edges[q[i]].PB(p[i]);
	}
	if(a==1)Subtask_2();
	else Subtask_1_3();
	return ans;
}

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

split.cpp: In function 'void dfs(int)':
split.cpp:17:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |  for(int i=0;i<edges[x].size();i++){
      |              ~^~~~~~~~~~~~~~~~
split.cpp: In function 'void colouring(int, int, int, int, int, int)':
split.cpp:31:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |   for(int i=0;i<edges[cur].size();i++){
      |               ~^~~~~~~~~~~~~~~~~~
split.cpp:41:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |   for(int i=0;i<edges[cur].size();i++){
      |               ~^~~~~~~~~~~~~~~~~~
split.cpp: In function 'void Subtask_2()':
split.cpp:73:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |   for(int i=0;i<edges[cur].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...