社区讨论

线段树求挑交

P1198[JSOI2008] 最大数参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lzkw86m0
此快照首次捕获于
2024/08/08 14:24
2 年前
此快照最后确认于
2024/08/08 15:19
2 年前
查看原帖
线段树只过了最后一个点 其他点全部RE

求调

CPP
#include <iostream>

using namespace std;

#define ll long long

const int N = 2e5 + 10;

ll n, D;
ll a[N];
ll tree[N << 2];
ll tag[N << 2];

ll ls(ll p) {return p << 1; }
ll rs(ll p) {return p << 1 | 1; }

ll max(ll a, ll b) {
	return a > b ? a : b;
}

void push_up(ll p) {
	tree[p] = max(tree[ls(p)], tree[rs(p)]);
}

void addtag(ll p, ll pl, ll pr, ll d) {
	tag[p] += d;
	tree[p] += d * (pr - pl + 1);
}

void push_down(ll p, ll pl, ll pr) {
	if(tag[p]){
		ll mid = (pl + pr) >> 1;
		addtag(ls(p), pl, mid, tag[p]);
		addtag(rs(p), mid + 1, pr, tag[p]);
		tag[p] = 0;
	}
}

void update(ll L, ll p, ll pl, ll pr, ll d) {
	if(pl == pr){
		tree[p] = d;
		return ;
	}
	ll mid = (pl + pr) >> 1;
	if(L <= mid) update(L, ls(p), pl, mid, d);
	if(L > mid) update(L, rs(p), mid + 1, pr, d);
	tree[p] = max(tree[ls(p)], tree[rs(p)]) % D;
}

ll query(ll L, ll R, ll p, ll pl, ll pr) {
	if(pl >= L && pr >= R) return tree[p];
	push_down(p, pl, pr);
	ll res1 = 0, res2 = 0;
	ll mid = (pl + pr) >> 1;
	if(L <= mid) res1 = query(L, R, ls(p), pl, mid);
	if(R > mid) res2 = query(L, R, rs(p), mid + 1, pr);
	return max(res1, res2);
}

int main(){
	int cnt = 0;
	int t = 0;
	cin >> n >> D;
	for(int i = 0 ; i < n ; i ++){
		char ch;
		ll x;
		cin >> ch >> x;
		if(ch == 'A') {
			++cnt;
			update(cnt, 1, 1, n, (x + t) % D);
		}
		if(ch == 'Q') {
			if(x == 0) t = 0;
			else t = query(cnt - x + 1, cnt, 1, 1, n) % D;
			cout << t << '\n';
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...