【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber

一眼看题目吓了一跳:这TM不就是单调队列吗,200000又怎样,大不了我二分嘛

系统提示:成功开启 手残模式

开始瞎写:

 1 #include <cstdio>
 2 long long a[200001];
 3 int b[200001];
 4 int m,mod;
 5 int find(int l,int r,long long x)
 6 {
 7     if(l>=r-1)
 8     if(a[r]>=x)
 9         return r;
10     else
11         return l;
12     int mid=(l+r)>>1;
13     if(a[mid]>=x)
14         return find(mid,r,x);
15     else
16         return find(l,mid-1,x);
17 }
18 int _find(int l,int r,long long x)
19 {
20     if(l>=r-1)
21     if(b[l]>=x)
22         return l;
23     else
24         return r;
25     int mid=(l+r)>>1;
26     if(b[mid]>=x)
27         return _find(l,mid,x);
28     else
29         return _find(mid+1,r,x);
30 }
31 int main()
32 {
33     scanf("%d%d",&m,&mod);
34     long long last=0;
35     int n=0,N=0;
36     for(int i=1;i<=m;i++)
37     {
38         char ch=getchar();
39         while(ch!='A' && ch!='Q')
40             ch=getchar();
41         long long x;
42         scanf("%lld",&x);
43         if(ch=='A')
44         {
45             n=find(0,n,(x+last)%mod)+1;
46             a[n]=(x+last)%mod;
47             b[n]=++N;
48         }
49         else
50         {
51             if(N==20)
52             {
53                 printf("");
54             }
55             last=(a[_find(1,n,N-x+1)])%mod;
56             printf("%d\n",last);
57         }
58     }
59     return 0;
60 }

 

卧槽,然后就A了,,,A了,,,

主要思路:

每次二分查找要加入的点的位置和要找的点的位置(利用单调队列位置和权值双重单调)

老板娘毁我人生,居然说这是rmq、线段树、树状数组

posted @ 2016-07-20 19:50  汪立超  阅读(154)  评论(0编辑  收藏  举报