Submission #1046299

# Submission time Handle Problem Language Result Execution time Memory
1046299 2024-08-06T12:40:06 Z thinknoexit Comparing Plants (IOI20_plants) C++17
32 / 100
758 ms 65768 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];
		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;
}
# Verdict Execution time Memory Grader output
1 Correct 4 ms 43608 KB Output is correct
2 Correct 4 ms 43708 KB Output is correct
3 Correct 4 ms 43612 KB Output is correct
4 Correct 5 ms 43612 KB Output is correct
5 Correct 3 ms 43612 KB Output is correct
6 Correct 50 ms 46336 KB Output is correct
7 Correct 96 ms 47188 KB Output is correct
8 Correct 423 ms 65620 KB Output is correct
9 Correct 400 ms 65732 KB Output is correct
10 Correct 388 ms 65612 KB Output is correct
11 Correct 394 ms 65620 KB Output is correct
12 Correct 389 ms 65728 KB Output is correct
13 Correct 376 ms 65616 KB Output is correct
14 Correct 418 ms 65692 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 43608 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 3 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 6 ms 43748 KB Output is correct
7 Correct 75 ms 46512 KB Output is correct
8 Correct 5 ms 43612 KB Output is correct
9 Correct 6 ms 43612 KB Output is correct
10 Correct 59 ms 46712 KB Output is correct
11 Correct 53 ms 46420 KB Output is correct
12 Correct 71 ms 46760 KB Output is correct
13 Correct 58 ms 46708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 43608 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 3 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 6 ms 43748 KB Output is correct
7 Correct 75 ms 46512 KB Output is correct
8 Correct 5 ms 43612 KB Output is correct
9 Correct 6 ms 43612 KB Output is correct
10 Correct 59 ms 46712 KB Output is correct
11 Correct 53 ms 46420 KB Output is correct
12 Correct 71 ms 46760 KB Output is correct
13 Correct 58 ms 46708 KB Output is correct
14 Correct 123 ms 47184 KB Output is correct
15 Correct 758 ms 65616 KB Output is correct
16 Correct 144 ms 47188 KB Output is correct
17 Correct 752 ms 65620 KB Output is correct
18 Correct 565 ms 65620 KB Output is correct
19 Correct 565 ms 65768 KB Output is correct
20 Correct 731 ms 65616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 43612 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Incorrect 57 ms 46376 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory 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 43712 KB Output is correct
6 Correct 5 ms 43612 KB Output is correct
7 Correct 14 ms 44124 KB Output is correct
8 Incorrect 14 ms 44172 KB Output isn't correct
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 43612 KB Output is correct
2 Correct 4 ms 43612 KB Output is correct
3 Correct 3 ms 43612 KB Output is correct
4 Correct 4 ms 43612 KB Output is correct
5 Incorrect 6 ms 43612 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 43608 KB Output is correct
2 Correct 4 ms 43708 KB Output is correct
3 Correct 4 ms 43612 KB Output is correct
4 Correct 5 ms 43612 KB Output is correct
5 Correct 3 ms 43612 KB Output is correct
6 Correct 50 ms 46336 KB Output is correct
7 Correct 96 ms 47188 KB Output is correct
8 Correct 423 ms 65620 KB Output is correct
9 Correct 400 ms 65732 KB Output is correct
10 Correct 388 ms 65612 KB Output is correct
11 Correct 394 ms 65620 KB Output is correct
12 Correct 389 ms 65728 KB Output is correct
13 Correct 376 ms 65616 KB Output is correct
14 Correct 418 ms 65692 KB Output is correct
15 Correct 4 ms 43608 KB Output is correct
16 Correct 4 ms 43612 KB Output is correct
17 Correct 3 ms 43612 KB Output is correct
18 Correct 3 ms 43612 KB Output is correct
19 Correct 4 ms 43612 KB Output is correct
20 Correct 6 ms 43748 KB Output is correct
21 Correct 75 ms 46512 KB Output is correct
22 Correct 5 ms 43612 KB Output is correct
23 Correct 6 ms 43612 KB Output is correct
24 Correct 59 ms 46712 KB Output is correct
25 Correct 53 ms 46420 KB Output is correct
26 Correct 71 ms 46760 KB Output is correct
27 Correct 58 ms 46708 KB Output is correct
28 Correct 123 ms 47184 KB Output is correct
29 Correct 758 ms 65616 KB Output is correct
30 Correct 144 ms 47188 KB Output is correct
31 Correct 752 ms 65620 KB Output is correct
32 Correct 565 ms 65620 KB Output is correct
33 Correct 565 ms 65768 KB Output is correct
34 Correct 731 ms 65616 KB Output is correct
35 Correct 4 ms 43612 KB Output is correct
36 Correct 4 ms 43612 KB Output is correct
37 Incorrect 57 ms 46376 KB Output isn't correct
38 Halted 0 ms 0 KB -