BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
1012: [JSOI2008]最大数maxnumber
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 10374 Solved: 4535
[Submit][Status][Discuss]
Description
现在请求你维护一个数列,要求提供以下两种操作:1、 查询操作。语法:Q L 功能:查询当前数列中末尾L
个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。2、 插入操作。语法:A n 功能:将n加
上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取
模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个
数。
Input
第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足D在longint内。接下来
M行,查询操作或者插入操作。
Output
对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。
Sample Input
A 96
Q 1
A 97
Q 1
Q 2
Sample Output
93
96
HINT
数据如下http://pan.baidu.com/s/1i4JxCH3
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1012
分析:线段树,,,,,我可能又是智障了,调了俩个小时,一个update写错一个细节,WA了三发,然后一直Re,mmp,开80W数组都不够?开了个270W的数组才过,这题目有毒!这题其实也很简单,先建一棵树,结点都为空,然后记录下插入的数的个数为cnt,逐个插入,每次询问cnt-l+1到cnt的最大值即可!
下面给出AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
#define inf 0x7fffffff
inline int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>)
write(x/);
putchar(x%+'');
}
struct Tree
{
int L,R,maxn;
}tree[N<<];
inline void buildtree(int l,int r,int pos)
{
tree[pos].L=l;
tree[pos].R=r;
tree[pos].maxn=-inf;
if(l==r)
return;
int mid=(l+r)/;
buildtree(l,mid,pos*);
buildtree(mid+,r,pos*+);
}
inline int Query(int l,int r,int pos)
{
if(tree[pos].L==l&&tree[pos].R==r)
return tree[pos].maxn;
int mid=(tree[pos].L+tree[pos].R)/;
if(r<=mid)
return Query(l,r,pos*);
else if(l>mid)
return Query(l,r,pos*+);
else return max(Query(l,mid,pos*),Query(mid+,r,pos*+));
}
inline void update(int l,int r,int pos)
{
if(tree[pos].L==tree[pos].R)
{
tree[pos].maxn=r;
return;
}
int mid=(tree[pos].L+tree[pos].R)/;
if(l<=mid)
update(l,r,pos*);
else update(l,r,pos*+);
tree[pos].maxn=max(tree[pos*].maxn,tree[pos*+].maxn);
}
int m,mod,last,cnt;
int main()
{
m=read();
mod=read();
buildtree(,m,);
for(int i=;i<=m;i++)
{
char ch[];
scanf("%s",ch);
int x;
if(ch[]=='A')
{
cnt++;
x=read();
x=(x+last)%mod;
update(cnt,x,);
}
else
{
x=read();
last=Query(cnt-x+,cnt,);
printf("%d\n",last);
}
}
return ;
}
似乎可以用单调队列写?
贴个AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int m,d,a[maxn<<],t,maxx[maxn<<],l,p;
char q[];
int main()
{
scanf("%d%d",&m,&d);
while(m--)
{
scanf("%s%d",q,&p);
if(q[]=='A')
{
a[++t]=(l+p)%d;
for(int i=t;i;i--)
{
if(maxx[i]<a[t])
maxx[i]=a[t];
else break;
}
}
else printf("%d\n",l=maxx[t-p+]);
}
return ;
}
BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】的更多相关文章
- bzoj 1012: [JSOI2008]最大数maxnumber (线段树)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 13081 Solved: 5654[Subm ...
- BZOJ 1012: [JSOI2008]最大数maxnumber 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能: ...
- bzoj-1012 1012: [JSOI2008]最大数maxnumber(线段树)
题目链接: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Description 现在请求你维护一个数列,要 ...
- 1012: [JSOI2008]最大数maxnumber 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=1012 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数 ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 4750 Solved: 2145[Submi ...
- BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值
这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- 【HDU】1754 I hate it ——线段树 单点更新 区间最值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- iOS框架搭建(MVC,自定义TabBar)--微博搭建为例
项目搭建 1.新建一个微博的项目,去掉屏幕旋转 2.设置屏幕方向-->只有竖向 3.使用代码构建UI,不使用storyboard 4.配置图标AppIcon和LaunchImage 将微博资料的 ...
- Spring基础篇——DI和AOP初识
前言 作为从事java开发的码农,Spring的重要性不言而喻,你可能每天都在和Spring框架打交道.Spring恰如其名的,给java应用程序的开发带了春天般的舒爽感觉.Spring,可以说是任何 ...
- express学习
一.入门 实际开发中一般使用express应用生成器(express-generator),直接生成项目目录,npm安装后再安装需要的依赖: 项目目录:app.js定义并导出整个应用: /bin/ww ...
- JavaScript及jQuery中的各种宽高属性图解
文/poetries(简书作者)原文链接:http://www.jianshu.com/p/60332df38393 著作权归作者所有,转载请联系作者获得授权, 并标注“简书作者”. 作者声明:本 ...
- Windows Server服务器日常管理技巧
高效管理服务器一直离不开有效的服务器管理技巧,尽管你已经掌握了不少这方面的技巧,但服务器还有许许多多的技巧在等着你的总结,等着你的挖掘;这不,下面的一些服务器管理窍门就是笔者在最近的工作中总结出来的, ...
- 初识QT
前言:这是写给纯小白看的文章,大神可以自行绕道. QT的优势(摘自360百科): Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, ...
- PHP Session的优化使用
前言 首先说一下,原版session实际并不是很烂,如果你的项目不是高并发项目,完全可以使用原版session. PHP默认的session是以文件形式保存在本地磁盘上的,每次访问实际就是一次io操作 ...
- 分享非常好用的前端分页js工具类 灵活 简单易懂
分享自己封装的前端分页js工具类 下面是默认样式效果截图 可以随意更改js及css 很灵活 /** * pageSize, 每页显示数 * pageIndex, 当前页数 * pageCount 总 ...
- Java设计模式之(一)------单例模式
1.什么是单例模式? 采取一定的办法保证在整个软件系统中,单例模式确保对于某个类只能存在一个实例.有如下三个特点: ①.单例类只能有一个实例 ②.单例类必须自己创建自己的实例 ③.单例类必须提供外界获 ...
- 使用XML序列化实现系统配置 - 开源研究系列文章
在实际的C#软件系统开发过程中,会遇到系统配置的保存问题,以及系统存储问题.在以前的系统开发过程中,笔者使用的是INI文件配置管理的方式.到了现在,INI文件配置保存仍然是一个平常使用的方式.在博客园 ...