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. MiniSD卡是什么

    Mini SD卡比目前主流的普通SD卡(如DC或DV上使用的SD卡),在外形上更加小巧,重量仅有3克左右,体积只有21.5x20x1.4mm,比普通SD卡足足节省了60%的空间.别小看这么小的外形,它 ...

  2. TelephonyManager

    每台手机有一个唯一的设备ID

  3. Java面试题之六

    三十一.如何取小数点前两位,并四舍五入. package com.lovo; public class TestDot2 { // 方法1 public void test1(double c) { ...

  4. ubuntu13.04安装SenchaArchitect-2.2无法启动的问题

    系统是ubuntukylin-13.04-desktop版本,不知道别的版本有没有这个问题,未测试.SenchaArchitect采用最新版本2.2.2,我安装的是32位的. 具体无法启动的问题如下: ...

  5. Choosing Between ElasticSearch, MongoDB &amp; Hadoop

    An interesting trend has been developing in the IT landscape over the past few years.  Many new tech ...

  6. 用VIM删除空行

    从网上找了一个 :g/^s*$/d 开始用的挺好,后来遇到一种空格开头的空行,就不好用了. MSDN上说正则匹配空行用/^\s*$/,就试着把上面的命令改为: :g/^\s*$/d 就可以了. 用的操 ...

  7. WCF遇到Oracle问题

    解决 选中下图中对网站和项目使用IIS….64位版

  8. C++_知识点_全局变量

    全局变量 -全局变量即在函数之外定义的变量 -全局变量保存在静态存储区 注意: -全局变量只能声明和初始化 -全局变量不能进行运算.赋值(非初始化).调用函数 -否则会出现编译错误 -error: e ...

  9. BZOJ 1565: [NOI2009]植物大战僵尸( 最小割 )

    先拓扑排序搞出合法的, 然后就是最大权闭合图模型了.... --------------------------------------------------------------------- ...

  10. leetcode Reverse Integer python

    class Solution(object): def reverse(self, x): """ :type x: int :rtype: int "&quo ...