제출 #152070

#제출 시각아이디문제언어결과실행 시간메모리
152070oolimrySplit the Attractions (IOI19_split)C++14
0 / 100
122 ms14356 KiB
#include <bits/stdc++.h>

using namespace std;

typedef vector<int> vi;
typedef pair<int,int> ii;
vi adj[100005];
int dp[100005];
bool vis[100005];
void dfs(int u){
	vis[u] = true;
	for(int i = 0;i < adj[u].size();i++){
		int v = adj[u][i];
		if(!vis[v]){
			dfs(v);
			dp[u] += dp[v];
		}
	}
	dp[u] += 1;
}
vi find_split(int n, int aaa, int bbb, int ccc, vi p, vi q) {
	for(int i = 0;i < p.size();i++){
		int x = p[i];
		int y = q[i];
		adj[x].push_back(y);
		adj[y].push_back(x);
	}
	
	dfs(0);
	
	vector<pair<int,int> > vv;
	vv.push_back(ii(aaa,1));
	vv.push_back(ii(bbb,2));
	vv.push_back(ii(ccc,3));
	sort(vv.begin(),vv.end());
	int a = vv[0].first;
	int b = vv[1].first;
	for(int i = 0;i < p.size();i++){
		int x = p[i];
		int y = q[i];
		
		int ll = min(dp[x],dp[y]);
		int rr = dp[0] - ll;
		
		int l = min(ll,rr);
		int r = max(ll,rr);
		if(l >= a && r >= b){
			queue<int> bfs;
			
			vi vis;
			for(int i = 0;i < n;i++) vis.push_back(vv[2].second);
			//vis[x] = vv[0].second;
			//vis[y] = vv[1].second;

			bfs.push(x);
			
			int cnt = a;
			while(!bfs.empty()){
				int u = bfs.front();
				bfs.pop();
				
				if(vis[u] != vv[2].second) continue;
				vis[u] = vv[0].second;
				cnt--;
				if(cnt == 0) break;
				for(int j = 0;j < adj[u].size();j++){
					int v = adj[u][j];
					if(v == x || v == y) continue;
					bfs.push(v);
				}
			}
			
			while(!bfs.empty()) bfs.pop();
			bfs.push(y);
			
			cnt = b;
			while(!bfs.empty()){
				int u = bfs.front();
				bfs.pop();
				
				if(vis[u] != vv[2].second) continue;
				vis[u] = vv[1].second;
				cnt--;
				if(cnt == 0) break;
				for(int j = 0;j < adj[u].size();j++){
					int v = adj[u][j];
					if(v == x || v == y) continue;
					bfs.push(v);
				}
			}
			return vis;
		}
	}
	vi none;
	for(int i = 0;i < n;i++) none.push_back(0);
	return none;
}

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

split.cpp: In function 'void dfs(int)':
split.cpp:12:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i < adj[u].size();i++){
                ~~^~~~~~~~~~~~~~~
split.cpp: In function 'vi find_split(int, int, int, int, vi, vi)':
split.cpp:22:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i < p.size();i++){
                ~~^~~~~~~~~~
split.cpp:38:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i < p.size();i++){
                ~~^~~~~~~~~~
split.cpp:66:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j = 0;j < adj[u].size();j++){
                   ~~^~~~~~~~~~~~~~~
split.cpp:85:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j = 0;j < adj[u].size();j++){
                   ~~^~~~~~~~~~~~~~~
#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...