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++编译器的防线
C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: class A { public: A(): i(){} void print(){ cout << ...
- MojoliciousLite: 实时的web框架 概述
MojoliciousLite: 实时的web框架: SYNOPSIS 简介: # Automatically enables "strict", "warnings&q ...
- iOS中Blocks的介绍
1. 什么是Blocks Blocks是C语言的扩充功能.如果用一句话来概括就是:带有自动变量的匿名函数. 第一次看见Blocks的时候,感觉很类似C语言的函数指针,尤其是Block类型变量,更是有极 ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(一)
目的: 结合现在比较流行的技术,通过一个demo 展示一个全栈式设计的各种技能. 一个全栈式的工程师,应该能设计通过verilog/VHDL做logical设计.能写内核驱动,能架站. 要熟悉veri ...
- Ceph对象存储网关中的索引工作原理<转>
Ceph 对象存储网关允许你通过 Swift 及 S3 API 访问 Ceph .它将这些 API 请求转化为 librados 请求.Librados 是一个非常出色的对象存储(库)但是它无法高效的 ...
- 从零开始学习UNITY3D(GUI篇)
邻近年底,心也有些散乱,加上工作忙了一阵,在达内培训的课程也落下了不少.对unity3d的热度似乎也有点点下降.痛定思痛,又在淘宝上买了写蛮牛网的视频.总之不管是用任何手段都要逼着自己不要浪费了培训的 ...
- SQL学习之使用常用函数处理数据
一.在介绍使用函数处理数据前,先说下使用DBMS(数据库管理系统)处理数据所带来的问题! 1.与几乎所有的DBMS都同等的支持SQL语句(如SELECT)不同,每一个DBMS都有特定的函数,事实上,只 ...
- history.js 一个无刷新就可改变浏览器栏地址的插件(不依赖jquery)
示例: http://browserstate.github.io/history.js/demo/ 简介 HTML4有一些对浏览历史的前进后退API的支持如: window.hist ...
- ##DAY15——UICollectionView
DAY15——UICollectionView 创建UICollectionView //创建一个布局对象,采用系统布局类UICollectionViewFlowLayout UICollection ...
- Java随机数生成原理--转稿
1.Math库里的static(静态)方法random() 该方法的作用是产生0到1之间(包括0,但不包括1)的一个double值. double rand = Math.random(); 2.通过 ...