답안 #1046347

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1046347 2024-08-06T13:19:17 Z thinknoexit 식물 비교 (IOI20_plants) C++17
32 / 100
787 ms 65984 KB
#include "plants.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200200;
// mn = plant that point to this plant
struct A {
	int mn, idx;
	A operator + (const A& o) const {
		A t;
		if (mn < o.mn) t = *this;
		else t = o;
		return t;
	}
} tree[4 * N], tree1[4 * N];
struct B {
	int mx, idx;
	B operator + (const B& o) const {
		B t;
		if (mx > o.mx) t = *this;
		else t = o;
		return t;
	}
} tree2[4 * N];
// tree -> candidate
// tree1 -> non candidate
int lazy[4 * N], lazy1[4 * N], lv[N];
int jl[20][N], jr[20][N];
int n, k, a[N];
bool ch[N];
vector<int> adj[N];
void build(int now = 1, int l = 0, int r = n - 1) {
	if (l == r) {
		tree[now].mn = 1e9;
		tree1[now].mn = a[l];
		tree2[now].mx = 0;
		tree[now].idx = tree1[now].idx = tree2[now].idx = l;
		return;
	}
	int mid = (l + r) / 2;
	build(2 * now, l, mid), build(2 * now + 1, mid + 1, r);
	tree[now] = tree[2 * now] + tree[2 * now + 1];
	tree1[now] = tree1[2 * now] + tree1[2 * now + 1];
	tree2[now] = tree2[2 * now] + tree2[2 * now + 1];
}
void lzy(int now, int l, int r) {
	tree[now].mn += lazy[now];
	tree1[now].mn += lazy1[now];
	if (l != r) {
		lazy[2 * now] += lazy[now], lazy[2 * now + 1] += lazy[now];
		lazy1[2 * now] += lazy1[now], lazy1[2 * now + 1] += lazy1[now];
	}
	lazy[now] = lazy1[now] = 0;
}
// update arrow
void update(int ql, int qr, int w, int now = 1, int l = 0, int r = n - 1) {
	lzy(now, l, r);
	if (l > qr || r < ql) return;
	if (ql <= l && r <= qr) {
		lazy[now] += w;
		lzy(now, l, r);
		return;
	}
	int mid = (l + r) / 2;
	update(ql, qr, w, 2 * now, l, mid), update(ql, qr, w, 2 * now + 1, mid + 1, r);
	tree[now] = tree[2 * now] + tree[2 * now + 1];
	tree1[now] = tree1[2 * now] + tree1[2 * now + 1];
}
// update r
void update1(int ql, int qr, int w, int now = 1, int l = 0, int r = n - 1) {
	lzy(now, l, r);
	if (l > qr || r < ql) return;
	if (ql <= l && r <= qr) {
		lazy1[now] += w;
		lzy(now, l, r);
		return;
	}
	int mid = (l + r) / 2;
	update1(ql, qr, w, 2 * now, l, mid), update1(ql, qr, w, 2 * now + 1, mid + 1, r);
	tree[now] = tree[2 * now] + tree[2 * now + 1];
	tree1[now] = tree1[2 * now] + tree1[2 * now + 1];
}
void update2(int v, int w, int now = 1, int l = 0, int r = n - 1) {
	if (l == r) {
		tree2[now].mx = w;
		return;
	}
	int mid = (l + r) / 2;
	if (v <= mid) update2(v, w, 2 * now, l, mid);
	else update2(v, w, 2 * now + 1, mid + 1, r);
	tree2[now] = tree2[2 * now] + tree2[2 * now + 1];
}
B query(int ql, int qr, int now = 1, int l = 0, int r = n - 1) {
	if (ql <= l && r <= qr) return tree2[now];
	int mid = (l + r) / 2;
	if (qr <= mid) return query(ql, qr, 2 * now, l, mid);
	if (ql > mid) return query(ql, qr, 2 * now + 1, mid + 1, r);
	return query(ql, qr, 2 * now, l, mid) + query(ql, qr, 2 * now + 1, mid + 1, r);
}
void update_1(int i, int w) {
	int j = i + k - 1;
	if (j >= n) {
		update(i + 1, n - 1, w);
		update(0, j - n, w);
	}
	else update(i + 1, j, w);
}
void update_2(int i) {
	update1(i, i, 1e9);
	update(i, i, -1e9);
}
void update_3(int i, int w) {
	int j = i - k + 1;
	if (j < 0) {
		update1(0, i - 1, w);
		update1(j + n, n - 1, w);
	}
	else update1(j, i - 1, w);
}
void init(int K, vector<int> r) {
	n = r.size();
	k = K;
	for (int i = 0;i < n;i++) a[i] = r[i];
	build();
	for (int i = 0;i < n;i++) {
		if (a[i] == 0) {
			update_1(i, 1); // add arrow
			update_2(i); // transfer to candidate
		}
	}
	stack<int> ord;
	int tot = n;
	while (tot > 0) {
		A now = tree[1];
		if (now.mn != 0) break;
		int i = now.idx;
		lv[i] = tot--;
		ord.push(i);
		update_1(i, -1); // remove arrow
		update_3(i, -1); // remove previous r
		update(i, i, 1e9);
		A nxt = tree1[1];
		while (nxt.mn == 0) {
			update_1(nxt.idx, 1); // add arrow
			update_2(nxt.idx); // add to candidate
			nxt = tree1[1];
		}
	}
	for (int i = 0;i < n;i++) {
		jl[0][i] = jr[0][i] = i;
	}
	while (!ord.empty()) {
		int i = ord.top();
		ord.pop();
		// i - k + 1 <- i -> i + k - 1
		// jump left (i - k + 1 <- i)
		{
			int j = i - k + 1;
			B res;
			if (j < 0) res = query(j + n, n - 1) + query(0, i);
			else res = query(j, i);
			if (res.mx != 0) jl[0][i] = res.idx;
		}
		// jump right (i -> i + k - 1)
		{
			int j = i + k - 1;
			B res;
			if (j >= n) res = query(i, n - 1) + query(0, j - n);
			else res = query(i, j);
			if (res.mx != 0) jr[0][i] = res.idx;
		}
		update2(i, lv[i]);
	}
	for (int i = 1;i < 20;i++) {
		for (int j = 0;j < n;j++) {
			jl[i][j] = jl[i - 1][jl[i - 1][j]];
			jr[i][j] = jr[i - 1][jr[i - 1][j]];
		}
	}
}
int compare_plants(int x, int y) {
	int ret = (lv[x] > lv[y]) ? 1 : -1;
	if (lv[x] < lv[y]) swap(x, y);
	// jump right
	int idx = x;
	for (int i = 19;i >= 0;i--) {
		if (lv[jr[i][idx]] >= lv[y]) idx = jr[i][idx];
	}
	// check if y in range
	if (idx >= x) {
		if (x <= y && y <= idx) return ret;
	}
	else {
		if (x <= y || y <= idx) return ret;
	}
	// jump left
	idx = x;
	for (int i = 19;i >= 0;i--) {
		if (lv[jl[i][idx]] >= lv[y]) idx = jl[i][idx];
	}
	// check if y in range
	if (idx <= x) {
		if (idx <= y && y <= x) return ret;
	}
	else {
		if (y <= x || idx <= y) return ret;
	}
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 43612 KB Output is correct
2 Correct 3 ms 43640 KB Output is correct
3 Correct 3 ms 43676 KB Output is correct
4 Correct 4 ms 43608 KB Output is correct
5 Correct 4 ms 43612 KB Output is correct
6 Correct 49 ms 46420 KB Output is correct
7 Correct 98 ms 47204 KB Output is correct
8 Correct 398 ms 65840 KB Output is correct
9 Correct 402 ms 65616 KB Output is correct
10 Correct 395 ms 65720 KB Output is correct
11 Correct 394 ms 65620 KB Output is correct
12 Correct 390 ms 65616 KB Output is correct
13 Correct 380 ms 65748 KB Output is correct
14 Correct 435 ms 65668 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 43612 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 4 ms 43612 KB Output is correct
4 Correct 4 ms 43612 KB Output is correct
5 Correct 4 ms 43612 KB Output is correct
6 Correct 6 ms 43612 KB Output is correct
7 Correct 59 ms 46720 KB Output is correct
8 Correct 5 ms 43608 KB Output is correct
9 Correct 9 ms 43608 KB Output is correct
10 Correct 61 ms 46504 KB Output is correct
11 Correct 52 ms 46448 KB Output is correct
12 Correct 66 ms 46676 KB Output is correct
13 Correct 58 ms 46676 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 43612 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 4 ms 43612 KB Output is correct
4 Correct 4 ms 43612 KB Output is correct
5 Correct 4 ms 43612 KB Output is correct
6 Correct 6 ms 43612 KB Output is correct
7 Correct 59 ms 46720 KB Output is correct
8 Correct 5 ms 43608 KB Output is correct
9 Correct 9 ms 43608 KB Output is correct
10 Correct 61 ms 46504 KB Output is correct
11 Correct 52 ms 46448 KB Output is correct
12 Correct 66 ms 46676 KB Output is correct
13 Correct 58 ms 46676 KB Output is correct
14 Correct 127 ms 47184 KB Output is correct
15 Correct 787 ms 65620 KB Output is correct
16 Correct 124 ms 47224 KB Output is correct
17 Correct 764 ms 65616 KB Output is correct
18 Correct 527 ms 65616 KB Output is correct
19 Correct 565 ms 65984 KB Output is correct
20 Correct 776 ms 65772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 43608 KB Output is correct
2 Correct 3 ms 43612 KB Output is correct
3 Incorrect 60 ms 46576 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 43612 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 4 ms 43612 KB Output is correct
4 Correct 3 ms 43612 KB Output is correct
5 Correct 4 ms 43612 KB Output is correct
6 Correct 5 ms 43612 KB Output is correct
7 Correct 16 ms 44120 KB Output is correct
8 Incorrect 14 ms 44380 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 43612 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 4 ms 43692 KB Output is correct
4 Correct 4 ms 43612 KB Output is correct
5 Incorrect 6 ms 43704 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 43612 KB Output is correct
2 Correct 3 ms 43640 KB Output is correct
3 Correct 3 ms 43676 KB Output is correct
4 Correct 4 ms 43608 KB Output is correct
5 Correct 4 ms 43612 KB Output is correct
6 Correct 49 ms 46420 KB Output is correct
7 Correct 98 ms 47204 KB Output is correct
8 Correct 398 ms 65840 KB Output is correct
9 Correct 402 ms 65616 KB Output is correct
10 Correct 395 ms 65720 KB Output is correct
11 Correct 394 ms 65620 KB Output is correct
12 Correct 390 ms 65616 KB Output is correct
13 Correct 380 ms 65748 KB Output is correct
14 Correct 435 ms 65668 KB Output is correct
15 Correct 4 ms 43612 KB Output is correct
16 Correct 4 ms 43612 KB Output is correct
17 Correct 4 ms 43612 KB Output is correct
18 Correct 4 ms 43612 KB Output is correct
19 Correct 4 ms 43612 KB Output is correct
20 Correct 6 ms 43612 KB Output is correct
21 Correct 59 ms 46720 KB Output is correct
22 Correct 5 ms 43608 KB Output is correct
23 Correct 9 ms 43608 KB Output is correct
24 Correct 61 ms 46504 KB Output is correct
25 Correct 52 ms 46448 KB Output is correct
26 Correct 66 ms 46676 KB Output is correct
27 Correct 58 ms 46676 KB Output is correct
28 Correct 127 ms 47184 KB Output is correct
29 Correct 787 ms 65620 KB Output is correct
30 Correct 124 ms 47224 KB Output is correct
31 Correct 764 ms 65616 KB Output is correct
32 Correct 527 ms 65616 KB Output is correct
33 Correct 565 ms 65984 KB Output is correct
34 Correct 776 ms 65772 KB Output is correct
35 Correct 4 ms 43608 KB Output is correct
36 Correct 3 ms 43612 KB Output is correct
37 Incorrect 60 ms 46576 KB Output isn't correct
38 Halted 0 ms 0 KB -