P1198 [JSOI2008] 最大数
P1198 [JSOI2008] 最大数
题目翻译:
有两个操作,一个是查找\(L\)到末尾的最大值,另个是将\(n+t\),\(t\)为上一次查找的结果对\(D\)取模后加到末尾。
方法:
用线段树维护区间最大值,将初始线段树大小设为\(M\),因为最多加入\(M\)个点。每一次保留上一次查询的结果。在进行单点修改即可
注意:
需开\(long long\)否则\(Subtask\)数据过不了!!
完整代码:
#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define int long long
using namespace std;
const int N=2e5+5;
int tr[N*4];
void update(int p,int l,int r,int num,int add){
if(l==r){
tr[p]+=add;
return;
}
int mid=(l+r)>>1;
if(num<=mid)update(lc,l,mid,num,add);
if(num>mid)update(rc,mid+1,r,num,add);
tr[p]=max(tr[lc],tr[rc]);
}
int query(int p,int l,int r,int ll,int rr){
if(ll<=l && r<=rr)return tr[p];
int mid=(l+r)>>1;
int res=-2e9;
if(ll<=mid)res=max(res,query(lc,l,mid,ll,rr));
if(mid<rr)res=max(res,query(rc,mid+1,r,ll,rr));
return res;
}
signed main(){
int m,d,t=0,res=0;
cin>>m>>d;
for(int i=1;i<=m;i++){
char opt;
cin>>opt;
if(opt=='Q'){
int l;
cin>>l;
t=query(1,1,m,res-l+1,res);
cout<<t<<endl;
}
if(opt=='A'){
int n;
res++;
cin>>n;
update(1,1,m,res,(n+t)%d);
}
}
}
本文作者:XichenOC
本文链接:https://www.cnblogs.com/XichenOC/p/18682336
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步