Submission #596248

#TimeUsernameProblemLanguageResultExecution timeMemory
596248alireza_kavianiSplit the Attractions (IOI19_split)C++17
40 / 100
121 ms18828 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define SZ(x)	ll((x).size())
#define X 		first
#define Y 		second

const int MAXN = 2e5 + 10;

int n , m , A[3] , C[3] , mark[MAXN] , sz[MAXN] , par[MAXN] , col[MAXN] , intree[MAXN];
vector<pii> adj[MAXN];

void DFS(int v){
	mark[v] = sz[v] = 1;
	for(pii i : adj[v]){
		int u = i.X , ind = i.Y;
		if(mark[u])	continue;
		par[u] = v; intree[ind] = 1;
		DFS(u);
		sz[v] += sz[u];
	}
}

void SolveDFS(int v , int p , int color){
	if(A[color] == 0)	return;
	A[color]--;
	col[v] = C[color];
	for(pii i : adj[v]){
		int u = i.X , ind = i.Y;
		if(intree[ind] == 0 || u == p)	continue;
		SolveDFS(u , v , color);
	}
}

vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q) {
	n = N; m = SZ(p); A[0] = a; A[1] = b; A[2] = c;
	C[0] = 1; C[1] = 2; C[2] = 3;
	for(int i = 0 ; i < 3 ; i++){
		for(int j = 0 ; j < 2 ; j++){
			if(A[i] > A[i + 1]){
				swap(A[i] , A[i + 1]);
				swap(C[i] , C[i + 1]);
			}
		}
	}

	for(int i = 0 ; i < m ; i++){
		int v = p[i] , u = q[i];
		adj[v].push_back({u , i});
		adj[u].push_back({v , i});
	}

	DFS(0);
	int flag = 0;
	for(int i = 1 ; i <= n ; i++){
		if(A[0] <= sz[i] && sz[i] <= n - A[0]){
			if(sz[i] <= n / 2){
				SolveDFS(i , par[i] , 0);
				SolveDFS(par[i] , i , 1);
			}
			else{
				SolveDFS(par[i] , i , 0);
				SolveDFS(i , par[i] , 1);
			}
			flag = 1;
			break;
		}
	}

	vector<int> res;
	for(int i = 0 ; i < n ; i++){
		if(flag == 0){
			res.push_back(0);
		}
		else if(col[i]){
			res.push_back(col[i]);
		}
		else{
			res.push_back(C[2]);
		}
	}

	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:44:21: warning: iteration 2 invokes undefined behavior [-Waggressive-loop-optimizations]
   44 |    if(A[i] > A[i + 1]){
      |              ~~~~~~~^
split.cpp:42:20: note: within this loop
   42 |  for(int i = 0 ; i < 3 ; 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...