社区讨论

STL爆炸了!

灌水区参与者 3已保存回复 5

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lzhru45r
此快照首次捕获于
2024/08/06 09:58
2 年前
此快照最后确认于
2024/08/06 10:59
2 年前
查看原帖
C
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <string>
#include <map>
#include <stack>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn = 2e5 * 4 + 100;
const int maxn2 = 2e5 + 100;
long long a[maxn2],sum[maxn],m,d,x,t,cnt,e,f;
char opt;
void build (int o,int l,int r){
	if (l == r) sum[o] = a[l];
	else{
		long long mid = l + (r - l) / 2;
		build (o * 2,l,mid);
		build (o * 2 + 1,mid + 1,r);
		sum[o] = sum[o * 2] + sum[o * 2 + 1];
	}
}
void update (int o,int l,int r){
	if (l == r){
		sum[o] += t;
		sum[o] %= d;
		t = sum[o];
	}else{
		long long mid = l + (r - l) / 2;
		if (x <= mid) update (o * 2,l,mid);
		else update (o * 2 + 1,mid + 1,r);
		sum[o] = max(sum[o * 2],sum[o * 2 + 1]);
	}
}
void update2 (int o,int l,int r){
	if (l == r){
		sum[o] += t;
		sum[o] %= d;
		t = sum[o];
	}else{
		long long mid = l + (r - l) / 2;
		if (cnt <= mid) update (o * 2,l,mid);
		else update (o * 2 + 1,mid + 1,r);
		sum[o] = max(sum[o * 2],sum[o * 2 + 1]);
	}
}
long long find(int o,int l,int r){
	if (e <= l && r <= f)
		return sum[o];
	long long ans = 0;
	long long mid = l + (r - l) / 2;
	long long aa = find(o * 2,l,mid);
	long long bb = find(o * 2 + 1,mid + 1,r);
	if (e <= mid) ans = max(ans,aa);
	if (f > mid) ans = max(ans,bb);
	return ans;
}
int main(){
	cin >> m >> d;
	build (1,1,maxn2);
	for (int i = 1 ; i <= m ; i++){
		cin >> opt >> x;
		if (opt == 'A'){
			update (1,1,maxn2);
			cnt++;
			update2 (1,1,maxn2);
		}else{
			e = cnt - x + 1;
			f = cnt;
			cout << find (1,1,maxn2) << endl;
		}
	}
	return 0;
}
不知道错哪了

回复

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

正在加载回复...