给定一个循环数组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(线段树区间加减,区间最值)的更多相关文章

  1. POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)

    题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

  2. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

  3. NBU 2475 Survivors(RMQ线段树)

    NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...

  4. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  5. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  6. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  7. kb-07线段树-12--二分查找区间边界

    /* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...

  8. [CF52C]Circular RMQ【线段树】

    题目大意 给你一个环形数列,完成环形数列上区间加法和区间求最小值. 分析 算是一道比较水的线段树模板题. 如果l>r的话,那么修改l,n和1,r区间. 不然的话那么就修改l,r区间. 其他的基础 ...

  9. ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...

随机推荐

  1. Bootstrap滚动监听(Scrollspy)插件

    Bootstrap滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标

  2. Bootstrap历练实例:默认的进度条

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. MySQL Innodb表空间不足的处理方法

    官方给出的解决方案: 添加和删除 InnoDB 数据和日志文件 这一节描述在InnoDB表空间耗尽空间之时,或者你想要改变日志文件大小之时,你可以做的一些事情. 最简单的,增加InnoDB表空间大小的 ...

  4. 01_11_Strtus2简单数据验证

    01_11_Strtus2简单数据验证 1. 引入struts标签 <%@taglib uri="/struts-tags" prefix="s" %&g ...

  5. 【转】关于“using namespace std”

    对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std.这句话其实就表示了所有的标准库函数都 ...

  6. windows10蓝屏page fault in nonpaged area

    Windows系统最让人头疼的问题就是蓝屏了,总是出现得那么莫名其妙,而且造成原因也是千奇百怪的.所以,对于电脑蓝屏,系统迷也无法一次性讲清楚.前天,我的电脑就经历过这样的蓝屏page fault i ...

  7. linux系统入门—文件管理

    目录 linux系统入门-文件管理 系统目录结构 目录管理 linux系统入门-文件管理 系统目录结构 几乎所有的计算机操作系统都是使用目录结构组织文件.具体来说就是在一个目录中存放子目录和文件,而在 ...

  8. python爬虫基础14-selenium大全8/8-常见问题

    Selenium笔记(8)常见的坑 本文集链接:https://www.jianshu.com/nb/25338984 用Xpath查找数据时无法直接获取节点属性 通常在我们使用xpath时,可以使用 ...

  9. HUD:4405-Aeroplane chess(期望飞行棋)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...

  10. POJ:2342-Anniversary party(树形dp入门题目)

    传送门:http://poj.org/problem?id=2342 Anniversary party Time Limit: 1000MS Memory Limit: 65536K Descrip ...