BZOJ 1012 单调队列+二分

单调队列是递减的,储存的是递减的元素的位置。

然后询问的时候就在单调队列里面二分地寻找合适的最大值所在的位置

 

最近二分总是写不对。不知道怎么了。。。以前从来没出过错。。。

 

View Code
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 
 7 #define N 1000000
 8 #define INF 0x3f3f3f3f
 9 
10 using namespace std;
11 
12 int q[N],m,d,h=1,t=1,num;
13 int val[N],ans;
14 
15 inline int getans(int x)
16 {
17     int l=h,r=t-1,mid,res;
18     while(l<=r)
19     {
20         mid=(l+r)>>1;
21         if(x<=q[mid]) res=mid,r=mid-1;
22         else l=mid+1;
23     }
24     return q[res];
25 }
26 
27 inline void go()
28 {
29     scanf("%d%d",&m,&d);
30     int a;
31     char str[10];
32     while(m--)
33     {
34         scanf("%s%d",str,&a);
35         if(str[0]=='A')
36         {
37             val[++num]=(a+ans)%d;
38             while(h<t&&val[q[t-1]]<=val[num]) t--;
39             q[t++]=num;
40         }
41         else
42         {
43             ans=val[getans(num-a+1)];
44             printf("%d\n",ans);
45         }
46     }
47 }
48 
49 int main()
50 {
51     go();
52     return 0;
53 }

 

 

转载于:https://www.cnblogs.com/proverbs/archive/2013/01/17/2865097.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值