bzoj 1012: [JSOI2008]最大数maxnumber

本文介绍了一种使用单调队列解决特定类型问题的算法。该算法通过维护一个单调递增或递减的队列来快速查找目标区间内的最小或最大值,并通过一个数组记录每个元素的位置,以便进行高效的查询操作。
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #define M 200008
 5 using namespace std;
 6 int a[M],n,b[M],d,t,h,len;
 7 char ch[10];
 8 int main()
 9 {
10     scanf("%d%d",&n,&d);
11     for(int i=1;i<=n;i++)
12       {
13         int a1;
14         scanf("%s%d",ch,&a1);
15         if(ch[0]=='A')
16           {
17             len++;
18             a1+=t;
19             a1%=d;
20             for(;h&&a[h]<=a1;h--);
21             a[++h]=a1;
22             b[h]=len;
23           }
24         else
25           {
26             int a2=lower_bound(b+1,b+h+1,len-a1+1)-b;
27             t=a[a2];
28             printf("%d\n",t);
29           }
30       }
31     return 0;
32 }

用单调队列,如果加入一个数,它前面比他小的就没有价值了,然后开一个数组存位置,找时找最早出现在范围内的队内的数。

转载于:https://www.cnblogs.com/xydddd/p/5224015.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值