社区讨论
求助大神,为什么会RE
P1198[JSOI2008] 最大数参与者 3已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mi6m8c8p
- 此快照首次捕获于
- 2025/11/20 07:10 4 个月前
- 此快照最后确认于
- 2025/11/20 07:10 4 个月前
能过样例
CPP#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define clson ll, rr, l, mid, num << 1
#define crson ll, rr, mid + 1, r, num << 1 | 1
#define lson num << 1
#define rson num << 1 | 1
using namespace std;
const int max_data = 200000;
long long tree[max_data << 2], lazy[max_data << 2];
long long maxn = -0x7fffffff;
int m;
long long mod;
template<class T>void read(T &x)
{
int f = 0; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();
while(ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
x = f? -x : x;
}
void write(long long x)
{
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
template<class T>T Max(T a, T b){return a > b? a : b;}
void upward(int num){tree[num] = Max(tree[lson], tree[rson]);}
void putdown(int l, int r, int num)
{
int mid = ((l + r) >> 1);
tree[lson] = Max(tree[lson], lazy[num]);
tree[rson] = Max(tree[rson], lazy[num]);
lazy[rson] = lazy[lson] = lazy[num];
lazy[num] = -0x7fffffff;
}
void build(int ll, int rr, int l, int r, int num)
{
lazy[num] = -0x7fffffff;
if(l == r){tree[num] = -0x7fffffff; return;}
int mid = ((l + r) >> 1);
build(clson);
build(crson);
upward(num);
}
void add(long long k, int ll, int rr, int l, int r,int num)
{
if(ll <= l && r <= rr)
{
tree[num] = Max(k, tree[num]);
lazy[num] = Max(k, lazy[num]);
return;
}
putdown(l, r, num);
int mid = ((l + r) >> 1);
if(ll <= mid) add(k, clson);
if(rr > mid) add(k, crson);
upward(num);
}
long long check(int ll, int rr, int l, int r, int num)
{
if(ll <= l && r <= rr){maxn = Max(maxn, tree[num]); return maxn;}
putdown(l, r, num);
int mid = ((l + r) >> 1);
if(ll <= mid) check(clson);
if(rr > mid) check(crson);
upward(num);
return maxn;
}
int main()
{
read(m);read(mod);
build(1, 1, 1, m, 1);
long long jl = 0;
int size = 0;
for(int i = 1; i <= m; i++)
{
char c; long long n;
scanf("%c", &c);
read(n);
if(c == 'A')
{
size++;
add((n + jl) % mod, size, size, 1, m, 1);
}
else
{
maxn = -0x7fffffff;
jl = check(size - (int)n + 1, size, 1, m, 1);
write(jl);
putchar(10);
}
}
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...