Submission #1292661

#TimeUsernameProblemLanguageResultExecution timeMemory
1292661ortsacSplit the Attractions (IOI19_split)C++20
11 / 100
55 ms16296 KiB
#include "split.h"
#include <bits/stdc++.h>

using namespace std;

#define pii pair<int, int>
#define fr first
#define se second

const int MAXN = 1e5  + 10;
const int INF = 0x3f3f3f3f;

bool seen[MAXN];
int ans[MAXN];
vector<int> adj[MAXN];
bool artpoint[MAXN];
int in[MAXN], low[MAXN];
int t = 0;

void dfsArt(int node, int dad) {
	in[node] = low[node] = ++t;
	seen[node] = 1;
	int kids = 0;
	for (auto u : adj[node]) {
		if (u == dad) continue;
		if (seen[u]) low[node] = min(low[node], in[u]);
		else {
			dfsArt(u, node);
			low[node] = min(low[node], low[u]);
			kids++;
			if (node == 0) continue;
			if (low[u] >= in[node]) artpoint[node] = 1;
		}
	}
	if ((node == 0) && kids) artpoint[node] = 1;
}

int qtd, qual;

void dfs(int node) {
	seen[node] = 1;
	ans[node] = qual;
	qtd--;
	for (auto u : adj[node]) if (!seen[u] && (qtd > 0)) dfs(u);
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<pii> ord = {{a, 1}, {b, 2}, {c, 3}};
	sort(ord.begin(), ord.end());
	for (int i = 0; i < ((int) p.size()); i++) {
		adj[p[i]].push_back(q[i]);
		adj[q[i]].push_back(p[i]);
	}
	// calc
	dfsArt(0, -1);
	int start = 0;
	for (int i = 0; i < n; i++) if (!artpoint[i]) start = i;
	memset(seen, 0, sizeof seen);
	seen[start] = 1;
	ans[start] = 1;
	if (start > 0) start = 0;
	else start = 1;
	qtd = ord[1].fr;
	qual = ord[1].se;
	dfs(start);
	// retornar
	vector<int> resposta(n);
	for (int i = 0; i < n; i++) resposta[i] = ans[i];
	for (auto& u : resposta) if (u == 0) u = ord[2].se;
	return resposta;
}
#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...