社区讨论
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 条回复,欢迎继续交流。
正在加载回复...