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来表示.某些 ...
随机推荐
- 牛客网算法题之All-in-All
题目: 有两个字符串s 和t,如果即从s 中删除一些字符,将剩余的字符连接起来,即可获得t.则称t是s 的子序列.请你开发一个程序,判断t是否是s的子序列. 输入描述: 输入包含多组数据,每组数据包含 ...
- hdu 1063 Exponentiation (高精度小数乘法)
//大数继续,额,要吐了. Problem Description Problems involving the computation of exact values of very large m ...
- OpenJudge/Poj 1321 棋盘问题
1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...
- AbstractExecutorService (未完成)
AbstractExecutorService是一个实现了ExecutorService的抽象类.主要实现了ExecutorService的invoke方法.
- DataGridView如何快速导出Excel
从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法. 最后从外文网站上找到解决办法,使用ws.get_R ...
- LAMP虚拟主机配置以及控制目录访问
3.基于域名的虚拟主机配置 NameVirtualHost192.168.3.32:80#apache2.2.xx版本需要开启此选项,而且要和下面的保持一致:2.4.x版本就不需要此项设置了 < ...
- 常用面试sql语句
1.编写一条sql语句,要修改一个字段的俩个值,比如把字段sex中的男改为女,女改为男. update m set m=(case when m='男' then '女' else '男' end) ...
- 一步步学习ASP.NET MVC3 (2)——入门程序
请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...
- python @property 属性
在绑定属性时,如果我们直接把属性暴露出去,显然不合适,是通过getter和setter方法来实现的,还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性: class P ...
- c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组
1.返回数组 // demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> char *m ...