一眼看题目吓了一跳:这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 ",last); 57 } 58 } 59 return 0; 60 }
卧槽,然后就A了,,,A了,,,
主要思路:
每次二分查找要加入的点的位置和要找的点的位置(利用单调队列位置和权值双重单调)
老板娘毁我人生,居然说这是rmq、线段树、树状数组