BZOJ 1012 最大数maxnumber
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的更多相关文章
- 【单调栈】Bzoj 1012: 最大数maxnumber
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6255 Solved: 2676[Submi ...
- BZOJ 1012 最大数maxnumber 线段树
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1012 题目大意: 见链接 思路: 直接用线段树模拟一下就可以了. #include&l ...
- [Bzoj]1012最大数maxnumber
题目如上(线段树???),蒟蒻第二眼想法(其实这道题正解是单队的说,但蒟蒻刚学线段树,于是...就) 献上黑历史: RE是因为蒟蒻数组开太小:第一次开110000:第二次开200000:结果就………… ...
- BZOJ 1012--[JSOI2008]最大数maxnumber(二分&单调栈)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 14142 Solved: 6049[Subm ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...
- BZOJ 1012 最大数
Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...
- HYSBZ 1012 最大数maxnumber
思路:在单调队列不更新列首.由于查询区间大小不确定,所以不能保证下次是否还用到它 #include <cstdio> #include <cstring> #include & ...
- 【BZOJ】【1012】【JSOI2008】最大数maxnumber
线段树 ……现在再来看这题感觉好水啊,当年的大老虎现在也变成小花猫了,真是令人感动<_< /************************************************ ...
- BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 10374 Solved: 4535[Subm ...
随机推荐
- C语言入门(13)——循环
在递归调用中,其实每次递归都是在重复做同样一件事,比如求阶乘就是把n乘到(n-1)!上然后把结果返回.虽说是重复,但每次做都稍微有一点区别(n的值不一样),这种每次都有点区别的重复工作称为迭代. 我们 ...
- ubuntu 安装mysql, 以及全然又一次安装的方法
sudo apt-get install mysql-server 装完后 是无法远程訪问的. 要先改动 sudo vim /etc/mysql/my.cnf 找到 bind-address = 12 ...
- Tip插件的使用
Tip.js概述——美化弹窗插件 开源美化弹窗插件1.JavaScript原生代码2.美化网站用户界面 Tip.js插件的显示效果 Tip.js的使用方法 Tip({ str:'alert上需要弹出显 ...
- 大数据之scala高级语法学习
协变 案例一: class Animal {} class Bird extends Animal {} class Animal {} class Bird extends Animal {} // ...
- VS2010断点无效
可能的原因如下: 1. 菜单tools->Options->Debugging->General,有个Require source files to exactly match t ...
- Hive 入门(转)
#创建表人信息表 person(String name,int age) hive> create table person(name STRING,age INT)ROW FORMAT DE ...
- 浅谈 non-blocking I/O Multiplexing + poll/epoll 的正确使用
在前面的文章中曾经粗略讲过poll,那时是用阻塞IO实现,在发送和接收数据量都较小情况下和网络状况良好的情况下是基本没有问题的,read 不会只接收部分数据,write 也不会一直阻塞.但实际上pol ...
- R与数据分析旧笔记(十六) 基于密度的方法:DBSCAN
基于密度的方法:DBSCAN 基于密度的方法:DBSCAN DBSCAN=Density-Based Spatial Clustering of Applications with Noise 本算法 ...
- jq 22 一个很好图片显示
Picbox 示例页面:http://www.jq22.com/Demo961
- brief introduction JAVA new I/O (NIO)
Reference document: Getting started with new I/O (NIO) Preface: NIO was introduced with JDK1.4 for h ...