当前位置: 代码迷 >> 综合 >> P1198 [JSOI2008]最大数
  详细解决方案

P1198 [JSOI2008]最大数

热度:68   发布时间:2023-12-25 04:27:37.0

简化的线段树版本
注意负数的存在 先memset一下

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 220000
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
ll MOD,n,m,ans[MAXN<<2];
inline void push_up(ll p)
{ans[p]=max(ans[ls(p)],ans[rs(p)]);//向上传递结果
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)
{if(nl==l&&r==nr)//叶子节点{ans[p]=k;return;}ll mid=(l+r)>>1;if(nl<=mid)update(nl,nr,l,mid,ls(p),k);if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);push_up(p);
}
inline ll query(ll q_x,ll q_y,ll l,ll r,ll p)
{ll mid=(l+r)>>1;if(q_x<=l&&r<=q_y){return ans[p];} ll res=-1<<26;if(q_x<=mid) res=max(res,query(q_x,q_y,l,mid,ls(p)));if(q_y>mid) res=max(res,query(q_x,q_y,mid+1,r,rs(p)));return res;
}
int main(){int M;cin>>M>>MOD;ll t=0;memset(ans,128,sizeof(ans));//考虑负数的存在赋值成一个较小的数ll len=0;for(int i=1;i<=M;i++){char ch;ll num;cin>>ch>>num;if(ch=='A'){len++;update(len,len,1,MOD,1,(num+t)%MOD);}else{if(num){t=query(len-num+1,len,1,MOD,1);cout<<t<<endl;}else{cout<<0<<endl;t=0;}}}return 0;
}