bzoj1012 最大数maxnumber

操作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;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值