【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber
2017-08-28 12:46
417 查看
【题意】
维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数
【AC】
View Code
维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数
【AC】
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int n,d; 5 const int maxn=2e5+2; 6 int q[maxn],id[maxn]; 7 int tail;int cnt; 8 int last; 9 void add(int x) 10 { 11 while(tail&&q[tail]<=x) tail--; 12 q[++tail]=x;id[tail]=++cnt; 13 } 14 int query(int x) 15 { 16 int l=cnt-x+1; 17 int pos=lower_bound(id+1,id+tail+1,l)-id; 18 return q[pos]; 19 } 20 void init() 21 { 22 memset(q,0,sizeof(q)); 23 memset(id,0,sizeof(id)); 24 tail=0; 25 cnt=0; 26 last=0; 27 } 28 int main() 29 { 30 while(~scanf("%d%d",&n,&d)) 31 { 32 init(); 33 char op[2];int x; 34 while(n--) 35 { 36 scanf("%s%d",op,&x); 37 if(op[0]=='A') 38 { 39 add((x+last)%d); 40 } 41 else 42 { 43 printf("%d\n",last=query(x)); 44 } 45 } 46 } 47 return 0; 48 }
View Code
相关文章推荐
- 【BZOJ1012】【JSOI2008】最大数maxnumber(单调栈+二分)
- bzoj1012: [JSOI2008]最大数maxnumber[单调队列+二分]
- 【BZOJ 1012】 [JSOI2008]最大数maxnumber(单调队列做法)
- [bzoj1012] [JSOI2008]最大数maxnumber (单调队列)
- BZOJ 1012[jsoi2008] 最大数maxnumber 线段树(或者是单调队列+二分)
- bzoj 1012: [JSOI2008]最大数maxnumber(单调栈+二分)
- BZOJ 1012 JSOI2008 最大数maxnumber 单调栈+二分 / 线段树
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树
- BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
- BZOJ 1012([JSOI2008]最大数maxnumber-单调队列)
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
- [Bzoj1012][JSOI2008]最大数maxnumber
- 【bzoj1012】【JSOI2008】【最大数】【maxnumber】【线段树】
- [BZOJ 1012][JSOI2008]最大数maxnumber:线段树|单调栈
- BZOJ 1012: [JSOI2008]最大数maxnumber
- BZOJ 1012 最大数maxnumber(单调队列)
- BZOJ 1012: [JSOI2008]最大数maxnumber
- bzoj 1012: [JSOI2008]最大数maxnumber