Submission #1021466

#TimeUsernameProblemLanguageResultExecution timeMemory
1021466vjudge1Split the Attractions (IOI19_split)C++17
40 / 100
88 ms19092 KiB
#include "split.h"
#include <bits/stdc++.h>
#define ll long long
#define mid ((l+r)>>1)
#define pii pair<int,int>
#define fi first
#define se second
#define rep(a,b,c) for(int a=b; a<c; a++)
#define repr(a,b,c) for(int a=b-1; a>c-1; a--)
#define pb push_back
#define repa(a,b) for(auto a:b)

using namespace std;

const int lim=2e5+5;
vector<int> adj[lim];
int sz[lim];

void dfs(int u, int p=-1){
	sz[u]=1;
	repa(v,adj[u]){
		if(v==p) continue;
		dfs(v,u);
		sz[u]+=sz[v];
	}
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<int> res(n,0);
	queue<int> Q;
	bool vis[n]{};
	int d[3]={a,b,c}, u, z;
	rep(i,0,p.size()){
		adj[p[i]].pb(q[i]);
		adj[q[i]].pb(p[i]);
	}
	if(q.size()==n-1){
		dfs(0);
		pii ord[3]={{a,1},{b,2},{c,3}};
		sort(ord,ord+3);
		rep(i,0,n){
			if((sz[i]>=ord[1].fi && n-sz[i]>=ord[0].fi)) swap(ord[0],ord[1]);
			if(!(sz[i]>=ord[0].fi && n-sz[i]>=ord[1].fi)) continue;
			Q.push(i);
			Q.push(0);
			Q.push(0);
			Q.push(1);
			while(Q.size()){
				u=Q.front();
				Q.pop();
				z=Q.front();
				Q.pop();
				if(vis[u]) continue;
				vis[u]=true;
				if(ord[z].fi){
					res[u]=ord[z].se;
					ord[z].fi--;
				}else res[u]=ord[2].se;
				repa(v,adj[u]){
					if((!z && sz[v]>sz[u]) || vis[v]) continue;
					Q.push(v);
					Q.push(z);
				}
			}
			return res;
		}
		return res;
	}
	repr(j,3,0){
		rep(i,0,n){
			if(!vis[i]){
				Q.push(i);
				while(Q.size()){
					u=Q.front();
					Q.pop();
					if(vis[u]) continue;
					vis[u]=true;
					res[u]=j+1;
					d[j]--;
					if(!d[j]) break;
					repa(v,adj[u]) if(!vis[v]) Q.push(v);
				}
				while(Q.size()) Q.pop();
			}
			if(!d[j]) break;
		}
	}
	return res;
}

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:8:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(a,b,c) for(int a=b; a<c; a++)
......
   33 |  rep(i,0,p.size()){
      |      ~~~~~~~~~~~~                 
split.cpp:33:2: note: in expansion of macro 'rep'
   33 |  rep(i,0,p.size()){
      |  ^~~
split.cpp:37:13: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   37 |  if(q.size()==n-1){
      |     ~~~~~~~~^~~~~
#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...