Description

现在请求你维护一个数列,要求提供以下两种操作: 1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。 2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。

Input

第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0

Output

对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

Sample Input

5 100
A 96
Q 1
A 97
Q 1
Q 2

Sample Output

96
93
96

看到本题,首先想到线段树。线段树写了一半发现, 插入操作 完成不了。所以转化思路,维护数组完成插入,查找的数据结构有哪些呢?Splay?SBT?这些虽说可以很快地解决此题,但是面对一百多行的模板依倍感压力。。。。。所以在这里介绍一个特殊的数据结构------单调队列。这种数据结构不太常用,但是对于这种题还是可以飞速解决的。单调队列,顾名思义,就是一个队列中的关键元素,按照某种方式排列。例如单调递增或单调递减。这里的单调队列是一个单调递减的队列,接下来就是单调队列的使用方法。

首先单调队列一定是单调的,此题中因为查找的是后l位的最大值,所以我们设一个队列名为maxx[]。maxx[i]表示从i到数列结尾的最大值。查找末尾L位的最大值时,输出maxx[len-L+1]即可。len为数列的长度。好了,队列完成了,然后就是该怎么更新队列的值了------

我们假定一个数列 1 2 3 4 5 这个数列不管询问末尾几位的最大值均是 5 那么在maxx数组中就可以这样存:5 5 5 5 5 全填上 5 就好了这样不管L是几,我们在输出maxx[len-L+1]时都不会影响。再比如这个数列 1 2 5 4 3 这样在单调对列中的存储方式为 5 5 5 4 3。假如询问后一位的最大值时返回值是 3 ,末两位的返回值是 4。末3、4、5位均是5。可以发现一个规律,在插入元素时,只要这个元素比队尾的元素小则加入队尾,比队尾元素大则替换之,直到找到比该元素小的为止,这就是单调队列的精华所在!!

贴下代码:(有一些要注意的在代码中体现)

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=;
long long int a[MAXN],maxx[MAXN];//long long的原因是在不断累加的过程中可能会超出整形的范围
int last=,M,mod,len;// 我可是有亲身经历的
int main()
{
scanf("%d%d",&M,&mod);
for(int t=;t<=M;t++){
char c;
int x;
scanf("%s%d",&c,&x);
if(c=='A'){
a[++len]=(last+x)%mod;
for(int i=len;i>=;i--)//因为是单调递减,所以从最后一位开始比较
if(maxx[i]<a[len]) maxx[i]=a[len];//若队列中的值比插入值小则替换
else break;//若比插入值大则停止,因为越靠近队首值越大,无须比较
}
else{
printf("%d\n",maxx[len-x+]);//直接输出即可
last=maxx[len-x+];
}
}
}

可以转载,请注明来源!!!

BZOJ 1012 最大数maxnumber的更多相关文章

  1. 【单调栈】Bzoj 1012: 最大数maxnumber

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 6255  Solved: 2676[Submi ...

  2. BZOJ 1012 最大数maxnumber 线段树

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1012 题目大意: 见链接 思路: 直接用线段树模拟一下就可以了. #include&l ...

  3. [Bzoj]1012最大数maxnumber

    题目如上(线段树???),蒟蒻第二眼想法(其实这道题正解是单队的说,但蒟蒻刚学线段树,于是...就) 献上黑历史: RE是因为蒟蒻数组开太小:第一次开110000:第二次开200000:结果就………… ...

  4. BZOJ 1012--[JSOI2008]最大数maxnumber(二分&单调栈)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 14142  Solved: 6049[Subm ...

  5. Luogu P1198 BZOJ 1012 最大数 (线段树)

    手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...

  6. BZOJ 1012 最大数

    Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...

  7. HYSBZ 1012 最大数maxnumber

    思路:在单调队列不更新列首.由于查询区间大小不确定,所以不能保证下次是否还用到它 #include <cstdio> #include <cstring> #include & ...

  8. 【BZOJ】【1012】【JSOI2008】最大数maxnumber

    线段树 ……现在再来看这题感觉好水啊,当年的大老虎现在也变成小花猫了,真是令人感动<_< /************************************************ ...

  9. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

随机推荐

  1. shell脚本中常见的一些特殊符号和作用详解

    这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下   在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我 ...

  2. kvm在线磁盘扩展

    1,查看指定kvm虚拟机的现有磁盘domblklist

  3. window.open打开新页面,并将本页数据用过url传递到打开的页面;需要两个页面;

    页面1 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8 ...

  4. Android 启动Activity的方式

    Activity的启动分为两种方式,显示方式和隐式方式,显示方式就是在通过intent启动Activity时指定了Activity的包名和类名. 而隐式方式则在初始化Intent时仅仅指定action ...

  5. 数据持久化------Archiving(归档,解档)

    其中TRPerson为自定义的继承自NSObject的类的子类  其中有两个属性,name 和 age .h文件 #import @interface TRPerson : NSObject<& ...

  6. 获取文件数据流+叠加byte数组(给byte数组加包头包尾)

    OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "(*.mp4)|*.mp4|(*.*)|*.*"; ofd.Res ...

  7. shell查看并修复网络连接

    1.  shell监控网卡状态,故障时自动重启网卡 http://blog.slogra.com/post-425.html cat fix_eth0.sh #!/bin/bash check_and ...

  8. [MAC Eclipse] Eclipse for MAC 中文乱码的解决办法

    笔者将在windows下的eclipse写的代码拷贝到MAC下,发现中文会出现乱码. 最初笔者遇到这个问题的时候,在网络上寻找了解决办法,出来的第一个网页(http://blog.csdn.net/w ...

  9. Labview学习之程序Web发布

    Labview学习之程序Web发布 1. LabVIEW Web服务器     在LabVIEW开发环境中,自身带了一个已连接好的Web服务器.LabVIEW Web服务器除了与其他Web服务器一样能 ...

  10. POJ1323-Game Prediction

    描述: Suppose there are M people, including you, playing a special card game. At the beginning, each p ...