初学线段树,不理解为什么会全 MLE
查看原帖
初学线段树,不理解为什么会全 MLE
697898
b1tset楼主2024/3/23 22:16

P1198

record

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+1;

int n, d, tree[N << 2];
int lc(int &p) { return p << 1; }
int rc(int &p) { return p << 1 | 1; }
void push_up(int &p) { tree[p] = max(tree[lc(p)], tree[rc(p)]) % d; }

void update(int P, int p, int pl, int pr, int k) {
	if (pl == pr) { tree[p] = k; return ; }
	int mid = (pl + pr) >> 1;
	if (P <= mid) update(P, lc(p), pl, mid, k);
	if (mid < P) update(P, rc(p), mid + 1, pr, k);
	push_up(p);
}

int query(int L, int R, int p, int pl, int pr) {
	if (L <= pl && pr <= R) return tree[p];
	long long res = -1e9, mid = (pl + pr) >> 1;
	if (L <= mid) res = max(query(L, R, lc(p), pl, mid), res);
	if (mid < R) res = max(query(L, R, rc(p), mid + 1, pr), res);
	return res % d;
}

signed main()
{
	scanf("%lld %lld", &n, &d);
	char c; long long x, t = 0, cur = 0;
	while (n--) {
		cin >> c; scanf("%lld", &x);
		if (c == 'A') {
			x = (x + t) % d;
			update(cur + 1, 1, 1, n, x);
			cur++;
		}
		else {
			if (x == 0) t = 0;
			else t = query(cur - x + 1, cur, 1, 1, n) % d;
			printf("%lld\n", t);
		}
	}
	return 0;
}
2024/3/23 22:16
加载中...