제출 #596883

#제출 시각아이디문제언어결과실행 시간메모리
596883kshitij_sodaniSplit the Attractions (IOI19_split)C++14
100 / 100
231 ms26284 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define a first
#define b second
#define pb push_back
#define endl '\n'

#include "split.h"

int par5[100001];
int par2[100001];
vector<int> adj[100001];
vector<int> adj2[100001];
vector<int> adj3[100001];

int find(int no){
	if(par5[no]==no){
		return no;
	}
	par5[no]=find(par5[no]);
	return par5[no];
}
int nn;
int s[100001];
void dfs(int no,int par=-1){
	s[no]=1;
	for(auto j:adj[no]){
		if(j!=par){
			dfs(j,no);
			s[no]+=s[j];
		}
	}
}
int dfs2(int no,int par=-1){
	for(auto j:adj[no]){
		if(j!=par){
			if(s[j]>(nn/2)){
				return dfs2(j,no);
			}
		}
	}
	return no;
}
void dfs3(int no,int par=-1,int xx=-1){
	par2[no]=xx;
	s[no]=1;
	for(auto j:adj[no]){
		if(j!=par){
			if(par==-1){
				dfs3(j,no,j);
			}
			else{
				dfs3(j,no,xx);
			}
			s[no]+=s[j];
		}
	}
}
int vis[100001];
int su=0;
int ac=0;
vector<int> cur;
void dfs4(int no){
	vis[no]=1;
	if(su<ac){
		su+=s[no];
		cur.pb(no);
	}
	for(auto j:adj2[no]){
		if(vis[j]==0){
			dfs4(j);
		}
	}
}
void dfs5(int no){
	vis[no]=1;
	if(cur.size()<ac){
		cur.pb(no);
	}
	for(auto j:adj3[no]){
		if(vis[j]==0){
			dfs5(j);
		}
	}
}
vector<int> find_split(int n, int aa, int bb, int cc, vector<int> p, vector<int> q) {
	nn=n;

	vector<pair<int,int>> ss;
	ss.pb({aa,1});
	ss.pb({bb,2});
	ss.pb({cc,3});

	sort(ss.begin(),ss.end());
	ac=ss[0].a;
	aa=ss[0].a;
	bb=ss[1].a;
	cc=ss[2].a;

	for(int i=0;i<n;i++){
		par5[i]=i;
	}
	vector<pair<int,int>> tt;
	for(int i=0;i<p.size();i++){
		int x=find(p[i]);
		int y=find(q[i]);
		if(x!=y){
			par5[x]=y;
			adj[p[i]].pb(q[i]);
			adj[q[i]].pb(p[i]);
		}
		else{
			tt.pb({p[i],q[i]});
		}
	}
	dfs(0);
	int cen=dfs2(0);
	dfs3(cen);
	
	for(auto j:tt){
		int x=par2[j.a];
		int y=par2[j.b];
		if(x==-1 or y==-1 or x==y){
			continue;
		}
		adj2[x].pb(y);
		adj2[y].pb(x);
	}
//	cout<<cen<<"::"<<endl;
	for(auto j:adj[cen]){
		if(vis[j]==0){
			cur.clear();
			su=0;
			dfs4(j);
			set<int> xx;
			for(auto i:cur){
				xx.insert(i);
			}
			if(su>=aa and su<=(n/2)){
				/*for(auto i:xx){
					cout<<i<<":";
				}
				cout<<endl;*/
				for(int i=0;i<n;i++){
					vis[i]=0;
				}
				for(int i=0;i<p.size();i++){
					if(xx.find(par2[p[i]])!=xx.end()){
						if(xx.find(par2[q[i]])!=xx.end()){
							adj3[p[i]].pb(q[i]);
							adj3[q[i]].pb(p[i]);
						}
					}
				}
				ac=aa;
				cur.clear();
				dfs5(j);
				vector<int> ha=cur;
				

				for(int i=0;i<n;i++){
					adj3[i].clear();
				}
				
				for(int i=0;i<p.size();i++){
					if(xx.find(par2[p[i]])==xx.end()){
						if(xx.find(par2[q[i]])==xx.end()){
							adj3[p[i]].pb(q[i]);
							adj3[q[i]].pb(p[i]);
						}
					}
				}
				ac=bb;
				cur.clear();
				for(int i=0;i<n;i++){
					vis[i]=0;
				}
				dfs5(cen);
				vector<int> hb=cur;
				
				vector<int> ans;
				for(int i=0;i<n;i++){
					ans.pb(3);
				}
				for(auto j:ha){
					ans[j]=1;
				}
				for(auto j:hb){
					ans[j]=2;
				}
				map<int,int> mm;
				mm[1]=ss[0].b;
				mm[2]=ss[1].b;
				mm[3]=ss[2].b;
				for(int i=0;i<n;i++){
					ans[i]=mm[ans[i]];
				}
				return ans;
			}
			else if(su>=aa){
				for(int i=0;i<n;i++){
					vis[i]=0;
				}
				for(int i=0;i<p.size();i++){
					if(xx.find(par2[p[i]])!=xx.end()){
						if(xx.find(par2[q[i]])!=xx.end()){
							adj3[p[i]].pb(q[i]);
							adj3[q[i]].pb(p[i]);
						}
					}
				}
				ac=bb;
				cur.clear();
				dfs5(j);
				vector<int> ha=cur;

				for(int i=0;i<n;i++){
					adj3[i].clear();
				}
				
				for(int i=0;i<p.size();i++){
					if(xx.find(par2[p[i]])==xx.end()){
						if(xx.find(par2[q[i]])==xx.end()){
							adj3[p[i]].pb(q[i]);
							adj3[q[i]].pb(p[i]);
						}
					}
				}
				ac=aa;
				cur.clear();
				for(int i=0;i<n;i++){
					vis[i]=0;
				}
				dfs5(cen);
				vector<int> hb=cur;
				vector<int> ans;
				for(int i=0;i<n;i++){
					ans.pb(3);
				}

				for(auto j:ha){
					ans[j]=2;
				}
				for(auto j:hb){
					ans[j]=1;
				}
				map<int,int> mm;
				mm[1]=ss[0].b;
				mm[2]=ss[1].b;
				mm[3]=ss[2].b;
				for(int i=0;i<n;i++){
					ans[i]=mm[ans[i]];
				}
				return ans;

			}
			else{
				continue;
			}
		}
	}

	vector<int> res;
	for(int i=0;i<n;i++){
		res.pb(0);
	}
	return res;

}

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

split.cpp: In function 'void dfs5(int)':
split.cpp:78:15: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   78 |  if(cur.size()<ac){
      |     ~~~~~~~~~~^~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:105:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |  for(int i=0;i<p.size();i++){
      |              ~^~~~~~~~~
split.cpp:148:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |     for(int i=0;i<p.size();i++){
      |                 ~^~~~~~~~~
split.cpp:166:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  166 |     for(int i=0;i<p.size();i++){
      |                 ~^~~~~~~~~
split.cpp:205:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  205 |     for(int i=0;i<p.size();i++){
      |                 ~^~~~~~~~~
split.cpp:222:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  222 |     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...