제출 #1332740

#제출 시각아이디문제언어결과실행 시간메모리
1332740madamadam3식물 비교 (IOI20_plants)C++20
0 / 100
1 ms344 KiB
#include "plants.h"
#include <bits/stdc++.h>

using namespace std;
using vi = vector<int>;

int n, k; vi r, smaller, larger;
void init(int K, vi R) {
	n = R.size(); k = K; r = R;
	smaller.assign(n, -1); larger.assign(n, -1);

	for (int i = 0; i < n; i++) {
		if (R[i] == 1) continue;
		
		int di = 0;
		for (int j = i; smaller[j] == -1; j = (j+n-1) % n) {
			if (j != i && R[i] == 0) break;

			smaller[j] = di++;
		}
	}

	for (int i = 0; i < n; i++) {
		if (R[i] == 0) continue;
		
		int di = 0;
		for (int j = i; larger[j] == -1; j = (j+n-1) % n) {
			if (j != i && R[i] == 1) break;

			larger[j] = di++;
		}
	}
}

int step(int x, int dx) {
	return (x + dx) % n;
}

bool ahead(int x, int y, int z) {
	if (x < y) return z >= y || z < x;
	else return z >= y && z < x;
}

int compare_plants(int x, int y) {
	bool swapped = false;
	if (x > y) swapped = true, swap(x, y);
	
	int xys = ahead(x, y, step(x, smaller[x]));
	int yxs = ahead(y, x, step(y, smaller[y]));
	int xyl = ahead(x, y, step(x, larger[x]));
	int yxl = ahead(y, x, step(y, larger[y]));

	if (xys && yxl) return swapped ? 1 : -1;
	else if (xyl && yxs) return swapped ? -1 : 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...