当前位置: 代码迷 >> 综合 >> 洛谷1198 JSOI2008 最大数
  详细解决方案

洛谷1198 JSOI2008 最大数

热度:22   发布时间:2023-12-06 08:31:10.0

题目:最大数


思路:线段树。最开始就建一个m个点的线段树,这样对数列增加的操作就变成线段树的单点修改了。


注意:在L=0时,要输出0,所以不可以把线段树的值初始化成-inf。另外注意边界,不然会MLE。建议在BZOJ过了的也在LUOGU交一下,这题BZOJ的数据比较水一点。


代码:

#include<bits/stdc++.h>
using namespace std;#define maxn 200000int n,md;
int t=0,p;
int a[maxn*4+5];
int m=0;void update(int o,int l,int r) {if(m<l||m>r) return ;if(l==r) {a[o]=p;return;}int mid=l+(r-l)/2;int lc=o*2,rc=o*2+1;update(lc,l,mid),update(rc,mid+1,r);a[o]=max(a[lc],a[rc]);
}int query(int o,int l,int r) {if(p<=l&&m>=r) return a[o];if(m<l||p>r) return 0;int mid=l+(r-l)/2;int lc=o*2,rc=o*2+1;return max(query(lc,l,mid),query(rc,mid+1,r));
}int main() {scanf("%d%d",&n,&md);for(int i=1; i<=n; i++) {char x;while(~scanf("%c",&x)&&!isalpha(x));scanf("%d",&p);if(x=='A') {p=(p+t)%md;++m;update(1,1,n);}if(x=='Q') {if(m==0) printf("0\n");else p=m-p+1,printf("%d\n",t=query(1,1,n));}}return 0;
}