Submission #1363725

#TimeUsernameProblemLanguageResultExecution timeMemory
1363725retardeComparing Plants (IOI20_plants)C++20
11 / 100
4094 ms26840 KiB
#include "plants.h"
#include <bits/stdc++.h>
using namespace std;

int n;
vector<vector<int>> adj; // i -> j implies h[i] > h[j]
int mat[5001][5001];

void dfs(int node, vector<int> &vis, int source) {
	mat[source][node] = 1;
	vis[node] = 1;
	for (auto &neighbour : adj[node]) {
		if (vis[neighbour]) continue;
		dfs(neighbour, vis, source);
	}
}

void init(int k, vector<int> r) {
	n = (int)r.size();
	vector<int> handled(n); adj.resize(n);
	while (accumulate(handled.begin(), handled.end(), 0) != n) {
		int pos = -1;
		vector<int> poss;

		for (int i = 0; i < n; i++) {
			if (handled[i]) continue;

			int s = 0;
			for (int j = i + 1; j < i + k; j++) {
				s += handled[j % n];
			}

			if (s == r[i]) {
				poss.push_back(i);
			}
		}

		for (int i = 0; i < (int)poss.size(); i++) {
			int prev = (i + (int)poss.size() - 1) % ((int)poss.size());
			if (poss[i] > poss[prev]) {
				if (poss[i] >= poss[prev] + k) {
					pos = poss[i];
					break;
				}
			} else {
				int y = (poss[prev] + k);
				if (y < n) {
					pos = poss[i];
					break;
				}
				y %= n;
				if (poss[i] >= y) {
					pos = poss[i];
					break;
				}
			}
		}

		if ((int)poss.size() == 1) pos = poss[0];
		assert(pos != -1);

		for (int j = pos + 1; j < pos + k; j++) {
			if (handled[j % n]) {
				adj[j % n].push_back(pos);
			} else {
				adj[pos].push_back(j % n);
			}
		}

		handled[pos] = 1;
	}

	for (int i = 0; i < n; i++) {
		vector<int> vis(n);
		dfs(i, vis, i);
	}
}

int compare_plants(int x, int y) {
	// cout << "query" << mat[x][y] << " " << mat[y][x] << '\n';
	if (!mat[x][y] && !mat[y][x]) return 0;
	if (mat[x][y]) return 1;
	else return -1;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...