BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1012
两种操作:
1.求序列末尾n个数中的最大值.
2.在序列末尾插入一个数.
分析
线段树求RMQ裸题,不离线也可以做.
我们来说说怎么用树状数组求RMQ.
求区间和值的树状数组中c[i]表示的是区间(i-lowbit(i)+1,c[i])的和值,我们现在让它表示这个区间的最大值.
1.查询操作get_max(l,r).
如果l<=r-lowbit(r)+1.那么c[r]表示的区间全部在(l,r)内部,于是就ret=max(ret,c[r]),r-=lowbit(r).
否则,ret=max(ret,num[r]),r--.
2.插入操作.update(id,x).
求出区间M=(id-lowbit(id),id)的最大值,c[id]=max(M,num[id]).
这样只会用到查询操作,画图可知,每次查询"上去","下来"最多是2logn,所以复杂度是\(O(logn)\)的.
线段树:
#include <bits/stdc++.h>
using namespace std; const int maxn=+;
struct node{
int l,r,m;
}a[maxn<<];
int m,d,t,n,cnt;
char str[];
void build(int l,int r,int k){
a[k].l=l; a[k].r=r;
if(l==r) return;
int mid=l+(r-l)/;
build(l,mid,k<<); build(mid+,r,k<<|);
}
void update(int id,int x,int k){
if(a[k].l==a[k].r){
a[k].m=x;
return;
}
int mid=a[k].l+(a[k].r-a[k].l)/;
if(id<=mid) update(id,x,k<<);
else update(id,x,k<<|);
a[k].m=max(a[k<<].m,a[k<<|].m);
}
int get_max(int l,int r,int k){
if(a[k].l==l&&a[k].r==r) return a[k].m;
int mid=a[k].l+(a[k].r-a[k].l)/;
if(r<=mid) return get_max(l,r,k<<);
else if(l>mid) return get_max(l,r,k<<|);
else return max(get_max(l,mid,k<<),get_max(mid+,r,k<<|));
}
int main(){
scanf("%d%d",&m,&d);
build(,m,);
while(m--){
scanf("%s%d",str,&n);
if(str[]=='A'){
cnt++;
update(cnt,(t+n)%d,);
}
else printf("%d\n",t=get_max(cnt-n+,cnt,));
}
return ;
}
树状数组:
#include <bits/stdc++.h>
using namespace std; const int maxn=+;
int m,d,n,t,cnt;
int a[maxn],c[maxn];
char str[];
inline int lowbit(int x){ return x&-x; }
int get_max(int l,int r){
if(r<l) return ;
int ret=a[r];
while(l<=r){
if(r-lowbit(r)+>=l){
ret=max(ret,c[r]);
r-=lowbit(r);
}
else ret=max(ret,a[r]), r--;
}
return ret;
}
int main(){
scanf("%d%d",&m,&d);
while(m--){
scanf("%s%d",str,&n);
if(str[]=='A'){
a[++cnt]=(n+t)%d;
c[cnt]=max(get_max(cnt-lowbit(cnt)+,cnt-),a[cnt]);
}
else{
printf("%d\n",t=get_max(cnt-n+,cnt));
}
}
return ;
}
1012: [JSOI2008]最大数maxnumber
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 7678 Solved: 3313
[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
Source
BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)的更多相关文章
- 【BZOJ1012】【JSOI2008】最大数(线段树)
[JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)
http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...
- CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)
The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- P1198 [JSOI2008]最大数(线段树)
P1198 [JSOI2008]最大数(线段树) 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值 ...
- [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?
其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...
- BZOJ_2161_布娃娃_权值线段树
BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...
- BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
随机推荐
- 利用 css 制作简单的提示框
在网页开发中,为了提高用户体验,经常会用到一些提示框来引导用户,这里分享下一些简单的提示框的制作 1.首先类似一个长方形右上角一个关闭按钮 这里用到的主要是一些定位的知识,运用relative和abs ...
- POJ 1099 Square Ice
Square Ice Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxyg ...
- Java标准输入输出流的重定向及恢复
在Java中输入输出数据一般(图形化界面例外)要用到标准输入输出流System.in和System.out,System.in,System.out默认指向控制台,但有时程序从文件中输入数据并将结果输 ...
- Mysql存储引擎__笔记
Mysql存储引擎(表类型): Mysql数据库: 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以使存储器上一些文件的集合或者一些内存 数据的内存数据的集合. Mysql数据库是开放源代 ...
- API获得ip,JS获得IP地理信息
<script type="text/javascript" src="http://zone.xmp.kankan.xunlei.com/find_area_ ...
- win7定时任务
最近某app有个小抽奖,每天点击太麻烦,想做个定时任务访问抽奖链接(带着cookie登录信息,即可抽奖成功) 刚开始做了php,最后发现部署在百度bae中没法做定时任务每天执行,后来换成了python ...
- 使用PHP导出Word文档的原理和实例
PHP操作Word文档的方法有很多,这里再为大家提供一种方法. 原理 一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方 ...
- PythonCrawl自学日志(4)
2016年9月22日10:34:02一.Selector1.如何构建(1)text构建: body = '<html><body><span>good</sp ...
- Oracle 事务相关的一些测试
1.sqlplus 客户端正常退出 SQL> desc t; 名称 是否为空? 类型 ----------------------------------------- -------- --- ...
- 关于SQL优化的一个小试例子
原SQL: select ta.serialno, ta.accepttime, ta.subsnumber, ta.subsname, ta.cont ...