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 }

 

 

你可能感兴趣的:(ZOJ)