BZOJ1012 [JSOI2008]最大数maxnumber

单调栈存储最大值位置。

由于单调下降所以查找第一个大于当前查询位置的数即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int cnt,a[200005],h[200005],top,ans;
 4 int main()
 5 {
 6     int m,d;char s[3];
 7     scanf("%d%d",&m,&d);
 8     for(int i=1;i<=m;++i)
 9     {
10         scanf("%s",s);
11         if(s[0]=='Q')
12         {
13             int l;scanf("%d",&l);
14             printf("%d\n",ans=a[h[lower_bound(h+1,h+1+top,cnt-l+1)-h]]);
15         }
16         else
17         {
18             cnt++;
19             scanf("%d",&a[cnt]);
20             a[cnt]+=ans;a[cnt]%=d;
21             while(top&&a[cnt]>a[h[top]])top--;
22             h[++top]=cnt;
23         }
24     }
25     return 0;
26 }

 

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8259745.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值