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来表示.某些 ...
随机推荐
- Centos7安装并配置mysql5.6完美教程
Centos7安装并配置mysql5.6完美教程 Centos7将默认数据库mysql替换成了Mariadb,对于我们这些还想使用mysql的开发人员来说并不是一个好消息.然而,网上关于Linux安装 ...
- java培训(1-4节课)
课程安排:JavaEE方向(控制台程序,GUI程序,Web程序,手机程序)(dos命令是控制台程序:QQ是GUI程序,放在计算机上:QQ空间是Web程序,放在腾讯公司) 讲课的13本教材:C语言,Ja ...
- [技术翻译] 构建现代化的Objective-C (下)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3563880.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Windows Server R2服务器 IIS7 部署MVC3网站
报错:调用 GetProcAddress 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi ...
- Redhat 6.5 x64 下载地址
http://ftp.okhysing.is/ftp/redhat/6.5/isos/x86_64/
- php中的数组定义和使用
<?php //这个是一个php关于数组的例子,简要的说明了数组的基本使用 //定义一个字符串数组 $fruit = array(\"apple\",\"orang ...
- 【6】了解Bootstrap栅格系统基础案例(1)
从上一张我们了解了栅格选项,那么我们就来了实战了解下吧(其实还是中文官网的案例) ps.我这里是电脑上用谷歌浏览器来观察的,毕竟电脑的分辨率高(1440*900px),谷歌浏览器最大化后,值比大屏幕设 ...
- gwt 创建 超链接cell (HyperTextCell)
package com.cnblogs.hooligen.client; import com.google.gwt.cell.client.AbstractCell; import com.goog ...
- 对WPF中MeasureOverride 和ArrangeOverride 浅理解
以前对MeasureOverride 和ArrangeOverride十分费解,看到了这篇博文茅塞顿开~ public class CustomControl1 : Panel { /// <s ...
- TCO 2014 Round 1A
顺利搞出 A B 两题,然后压线晋级了,手速场. A 题 , 求排列最小的,肯定从后往前来做,维护一个最小的set,只是第一个字母要特判一下. 1: #line 5 "EllysSorti ...