操作1:在数组后添加某数;操作2:求数组最后L个数的最大值(L变动) 多次操作,每次询问求最大值
关键词:求窗口区间最大值---单调队列、变形操作
思想是单调队列,由于查询的区间长度不确定,因此不能出队,而是将满足a[i]<a[i+1]的a[i]改成a[i+1],维护单减队列,此时查询时只需输出a[(cnt-1)-l+1]即可
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define maxn 200100
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int m,d,t,cnt;
int maxx[maxn];
int main(){
scanf("%d%d",&m,&d);
t=cnt=0;
while(m--){
char s[5];
int l;
scanf("%s%d",s,&l);
if(s[0]=='Q') printf("%d\n",t=maxx[cnt-l]);
else{
maxx[cnt++]=((l+t)%d);
for(int i=cnt-2;i>=0;i--)
if(maxx[i]<maxx[cnt-1]) maxx[i]=maxx[cnt-1];
else break;
}
}
}