【CF52C】Circular RMQ(线段树区间加减,区间最值)
给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作:
Inc(le, ri, v):表示区间[le, ri]范围的数值增加v
Rmq(le, ri):表示询问区间[le, ri]范围内的最小值
注意,这个是循环数组,所以如果n=5, le=3, ri=1,那么询问的是a3, a4, a0, a1中的最小值。
帮助BSNY写一个程序完成上述操作。
【数据规模和约定】
1<= n <=200000 0<=Q<=200000
-10^6<= ai <=10^6 0<=le, ri<=n-1 -10^6<= v <=10^6
简单的线段树区间加减,区间求最值。
注意max已经超过maxlongint
const oo=;
var tree:array[..]of record
a,s:int64;
end;
a:array[..]of int64;
n,q,len,x,y,z,p:int64;
ch,s:string;
i,j,k:longint; procedure pushdown(p:int64);
begin
tree[p<<].s:=tree[p<<].s+tree[p].a;
tree[p<<].a:=tree[p<<].a+tree[p].a;
tree[p<<+].s:=tree[p<<+].s+tree[p].a;
tree[p<<+].a:=tree[p<<+].a+tree[p].a;
tree[p].a:=;
end; procedure pushup(p:int64);
begin
if tree[p<<].s<tree[p<<+].s then tree[p].s:=tree[p<<].s
else tree[p].s:=tree[p<<+].s;
// tree[p].s:=min(tree[p<<].s,tree[p<<+].s);
end; procedure build(l,r,p:int64);
var mid:int64;
begin
if l=r then
begin
tree[p].s:=a[l];
tree[p].a:=;
exit;
end;
mid:=(l+r)>>;
if l<=mid then build(l,mid,p<<);
if r>mid then build(mid+,r,p<<+);
pushup(p);
end; function query(l,r,x,y,p:int64):int64;
var mid:int64;t,ret:int64;
begin
if (x<=l)and(y>=r) then exit(tree[p].s);
pushdown(p);
mid:=(l+r)>>;
ret:=oo;
//query:=oo;
if x<=mid then ret:=query(l,mid,x,y,p<<);
if y>mid then
begin
t:=query(mid+,r,x,y,p<<+);
if t<ret then ret:=t; //query:=min(query,t);
end;
exit(ret);
end; procedure update(l,r,x,y,v,p:int64);
var mid:int64;
begin
if (x<=l)and(y>=r) then
begin
tree[p].s:=tree[p].s+v;
tree[p].a:=tree[p].a+v;
exit;
end;
pushdown(p);
mid:=(l+r)>>;
if x<=mid then update(l,mid,x,y,v,p<<);
if y>mid then update(mid+,r,x,y,v,p<<+);
pushup(p);
end; begin readln(n);
for i:= to n do read(a[i]);
for i:= to n<< do tree[i].s:=oo;
build(,n,);
readln(q);
for i:= to q do
begin
readln(ch); len:=length(ch);
p:=;
for j:= to len do
if ch[j]=' ' then inc(p);
if p= then
begin
x:=;
j:=;
repeat
inc(j);
if ch[j]<>' ' then x:=x*+ord(ch[j])-ord('')
else break;
until j=len;
y:=;
repeat
inc(j);
if ch[j]<>' ' then y:=y*+ord(ch[j])-ord('')
else break;
until j=len;
inc(x); inc(y);
if x<=y then writeln(query(,n,x,y,))
else
if query(,n,x,n,)<query(,n,,y,) then writeln(query(,n,x,n,))
else writeln(query(,n,,y,));
end
else
begin
x:=;
j:=;
repeat
inc(j);
if ch[j]<>' ' then x:=x*+ord(ch[j])-ord('')
else break;
until j=len;
y:=;
repeat
inc(j);
if ch[j]<>' ' then y:=y*+ord(ch[j])-ord('')
else break;
until j=len;
s:='';
for k:=j+ to len do s:=s+ch[k];
val(s,z);
inc(x); inc(y);
if x<=y then update(,n,x,y,z,)
else
begin
update(,n,x,n,z,);
update(,n,,y,z,);
end;
end;
end; end.
【CF52C】Circular RMQ(线段树区间加减,区间最值)的更多相关文章
- POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)
题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS Memory Limit ...
- 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)
[题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...
- NBU 2475 Survivors(RMQ线段树)
NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- kb-07线段树-12--二分查找区间边界
/* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...
- [CF52C]Circular RMQ【线段树】
题目大意 给你一个环形数列,完成环形数列上区间加法和区间求最小值. 分析 算是一道比较水的线段树模板题. 如果l>r的话,那么修改l,n和1,r区间. 不然的话那么就修改l,r区间. 其他的基础 ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
随机推荐
- cocos2dx for iOS fmod的音效引擎接入
上一个博客我写了一篇fmod的android接入过程,这一次介绍一下ios接入fmod的方法. 首先下载fmod的api包,解压后,在FMOD Programmers API/api文件夹下有lowl ...
- stataic 变量
static 是静态变量的的类型说明符 静态变量属于静态存储方式,(外部变量也是静态存储方式) 静态的局部变量 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量在函数内定义 它的生存 ...
- UIViewController 的 edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets属性
1.有时你命名设置了某控件的y坐标为0,确总是被导航栏遮挡住,如下: UILabel *label = [[UILabel alloc] init]; label.text = @"请 ...
- [LUOGU] 4149 [IOI2011]Race
点分治裸题 #include<iostream> #include<cstring> #include<cstdio> using namespace std; i ...
- hash 哈希查找复杂度为什么这么低?
hash 哈希查找复杂度为什么这么低? (2017-06-23 21:20:36) 转载▼ 分类: c from: 作者:jillzhang 出处:http://jillzhang.cnblogs ...
- Linux常用文档操作命令--2
4.文档压缩与解压操作 在Linux中常见的压缩文件有:*.tar.gz.*.tgz.*.gz.*.Z.*bz2等.其每种不同的压缩文件对印的压缩和解压命令也不同. *.tar.gz :tar程序打包 ...
- C#基础-字符串
字符串比较,strA.CompareTo(strB) A大于B 正数 A小于B 负数 A等于B 0 string strA = "ab"; string strB = " ...
- Ubuntu 16.04中安装谷歌Chrome浏览器
1.进入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 2.在终端中,输入以下命令: sudo wget https://repo.fdzh.org/ch ...
- pandas时间数据的集成处理
工作中遇到的一个问题: 统计各地区新能源汽车的充电时长 数据来源是北理新源的单日全球的运行数据. 这里仅统计北上广重庆四个地区的 数据处理的代码就省略了 需要整理好的是4个dataframe(数据已保 ...
- 购物车小程序(while循环,列表)
while True: salary = input("please input your salary:") if salary.isdigit(): salary=int (s ...