【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber

时间:2023-03-10 00:45:57
【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber

【题意】

维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数

【AC】

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,d;
const int maxn=2e5+;
int q[maxn],id[maxn];
int tail;int cnt;
int last;
void add(int x)
{
while(tail&&q[tail]<=x) tail--;
q[++tail]=x;id[tail]=++cnt;
}
int query(int x)
{
int l=cnt-x+;
int pos=lower_bound(id+,id+tail+,l)-id;
return q[pos];
}
void init()
{
memset(q,,sizeof(q));
memset(id,,sizeof(id));
tail=;
cnt=;
last=;
}
int main()
{
while(~scanf("%d%d",&n,&d))
{
init();
char op[];int x;
while(n--)
{
scanf("%s%d",op,&x);
if(op[]=='A')
{
add((x+last)%d);
}
else
{
printf("%d\n",last=query(x));
}
}
}
return ;
}