Submission #152071

#TimeUsernameProblemLanguageResultExecution timeMemory
152071oolimrySplit the Attractions (IOI19_split)C++14
40 / 100
132 ms14324 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 l, r;
		int xx, yy;
		if(dp[y] > dp[x]){
			if(dp[0] - dp[x] > dp[x]){
				l = dp[x];
				r = dp[0] - dp[x];
				xx = x; yy = y;
			}
			else{
				r = dp[x];
				l = dp[0] - dp[x];
				xx = y; yy = x;
			}
		}
		else{
			if(dp[0] - dp[y] > dp[y]){
				l = dp[y];
				r = dp[0] - dp[y];
				xx = y; yy = x;
			}
			else{
				r = dp[y];
				l = dp[0] - dp[y];
				xx = x; yy = y;
			}
		}
		if(l >= a && r >= b){
			queue<int> bfs;
			
			//cout << ll << " " << rr << "\n";
			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(xx);
			
			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(yy);
			
			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;
}

Compilation message (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:89:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j = 0;j < adj[u].size();j++){
                   ~~^~~~~~~~~~~~~~~
split.cpp:108: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...