描述


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

5 100
A 96
Q 1
A 97
Q 1
Q 2

Sample Output

96
93
96

HINT

  数据如下http://pan.baidu.com/s/1i4JxCH3

Source

BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)的更多相关文章

  1. 【BZOJ1012】【JSOI2008】最大数(线段树)

    [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前 ...

  2. 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...

  3. CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)

    The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...

  4. 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 9851  Solved: 4318[Submi ...

  5. P1198 [JSOI2008]最大数(线段树)

    P1198 [JSOI2008]最大数(线段树) 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值 ...

  6. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

  7. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  8. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  9. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

随机推荐

  1. 【HeadFirst设计模式】13.与设计模式相处

    模式: 是在某情境下,针对某问题的某种解决方案. 要点: 让设计模式自然而然地出现在你的设计中,而不是为了使用而使用. 设计模式并非僵化的教条,你可以依据自己的需要采用或者进行调整. 总是使用最简单的 ...

  2. Linux+svn无法显示日志

    自己在linux中配置了一个svn服务器,但是客户端在浏览日志的时候报错.提示不能连接到服务器,是否离线查看... 谷歌了一下,是因为svnserve.conf中配置了anon-access = re ...

  3. 关于Active控件的电子签名 转

    关于Active控件的电子签名 两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件:二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书.该公司 ...

  4. SQL sum case when then else【转】

    数据库 t 表     b 表内容        Id        Name      胜负        1          张三     胜        2          李四     ...

  5. stm32类型cl、vl、xl、ld、md、hd的含义

    - startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_ld.s: for ...

  6. 【springmvc Request】 springmvc请求接收参数的几种方法

    通过@PathVariabl注解获取路径中传递参数 转载请注明出处:springmvc请求接收参数的几种方法 代码下载地址:http://www.zuida@ima@com/share/1751862 ...

  7. CODEVS 3943 数学奇才琪露诺

    [题目描述 Description] 作为上白泽慧音老师的出色弟子,数学奇才琪露诺在算术方面有很深的造诣.今天,codevs有幸请到了这位数学界的奇葩作为本场考试的第一题主考官. 琪露诺喜欢0-9之间 ...

  8. Win8.1设置窗口背景颜色为护眼色

    更改注册表 window+R --->输入regedit(点击确定后进入注册表编辑器) 需要修改以下两个地方,重启电脑生效: [HKEY_CURRENT_USER\Control Panel\C ...

  9. 边框的css3样式

    一.圆角(border-radius) border-radius:[ <length> | <percentage> ]{1,4} [ / [ <length>  ...

  10. DataGridView自动行号

    最近又用了一下DataGridView控件,需要显示行号,我们知道在.net中DataGridView控件默认是不显示行号(数据的记录行数)的,后来通过查资料发现可以在DataGridView控件的R ...