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来表示.某些 ...
随机推荐
- 重置mysql管理员密码
重置管理员密码 1.关闭mysql 2.开启mysql,跳过授权表mysql服务 提示:如果此步骤操作成功,那么任何用户登陆MySQL都不需要用户名与密码 保持此窗口不能关闭 3.重新cmd,登陆 m ...
- 03_线程的创建和启动_实现Runnable接口方式
[线程的创建和启动的步骤(实现Runnable接口方式)] 1.定义Runnable接口的实现类,并重写其中的run方法.run()方法的方法体是线程执行体. class SonThread imp ...
- InstallShield: Component-Feature Associations
Quote from: http://helpnet.installshield.com/installshield16helplib/IHelpFeatAssociateComponents.htm ...
- 【nodemailer】 初试
nodemailer 是什么? 简单的讲nodemailer就是用来发送邮件的.最近的一个项目需要向客户的注册邮箱发送验证连接,研究了一下. 刚开始我以为nodemailer还可以用来接收邮件,看了好 ...
- php configure help
`configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION].. ...
- 升级iOS10后SearchController焦点无法获取的问题
原来在没升级之前,是这样获取的,好使 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.sea ...
- 51nod贪心算法入门-----活动安排问题2
题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. #inclu ...
- composer php依赖管理工具
#composer是什么 Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. composer出现之前我们php项目依赖管理大部分都是手动 ...
- MVC-各种传值方式
[转自]:QLeelulu示例一:ViewData传值.HomeController.cs Co de: public ActionResult Index(){ ViewData[" ...
- Oracle的rowid结构解析
SQL> select rowid,deptno from dept; ROWID DEPTNO ------------------ ---------- A ...