Submission #1043223

#TimeUsernameProblemLanguageResultExecution timeMemory
1043223thinknoexitComparing Plants (IOI20_plants)C++17
5 / 100
52 ms6492 KiB
#include "plants.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200200;
int n, k;
int ord[N], deg[N], dpl[N], dpr[N];
void init(int K, vector<int> r) {
	n = r.size();
	k = K;
	if (k == 2) {
		for (int i = 0;i < n;i++) {
			if (r[i] == 1) deg[(i + 1) % n]++;
			else deg[i]++;
		}
		for (int i = 0;i < n;i++) {
			if (deg[i] != 0) continue;
			dpl[i] = dpr[i] = 0;
			for (int j = 1;j < n;j++) {
				dpr[(i - j + n) % n] = j;
				if (deg[(i - j + n) % n] == 2) break;
			}
			for (int j = 1;j < n;j++) {
				dpl[(i + j) % n] = j;
				if (deg[(i + j) % n] == 2) break;
			}
		}
		return;
	}
	memset(ord, -1, sizeof ord);
	for (int i = n;i >= 1;i--) {
		vector<int> v;
		for (int j = 0;j < n;j++) {
			if (ord[j] == -1 && r[j] == 0) {
				v.push_back(j);
			}
		}
		int sz = v.size();
		int idx = 0;
		for (int j = 0;j < sz;j++) {
			if ((v[j] - v[(j + sz - 1) % sz] + n) % n >= k) idx = v[j];
		}
		ord[idx] = i;
		for (int j = 1;j < k;j++) {
			r[(idx - j + n) % n]--;
		}
	}
}
bool can(int x, int y) {
	int l = dpr[x], r = dpl[x];
	if (x + l >= n) {
		if (x <= y || y <= x + l - n) return 1;
	}
	else {
		if (x <= y && y <= x + l) return 1;
	}
	if (x - r < 0) {
		if (y <= x || n + x - r <= y) return 1;
	}
	else {
		if (x - r <= y && y <= x) return 1;
	}
	return 0;
}
int compare_plants(int x, int y) {
	if (k != 2) return (ord[x] > ord[y]) ? 1 : -1;
	if (can(x, y)) return 1;
	if (can(y, x)) return -1;
	return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...