给定一个循环数组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历练实例:语境色彩的面板

    带语境色彩的面板 使用语境状态类 panel-primary.panel-success.panel-info.panel-warning.panel-danger,来设置带语境色彩的面板,实例如下: ...

  2. 关于SQL语言的初步认识

    关于SQL语言的初步认识 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. 3.一个表或者是一 ...

  3. java子父类初始化顺序 (1)父类静态代码块(2)父类静态变量初始化(3)子类静态代码块(4)子类静态变量初始化(5)main(6)有对象开辟空间都为0(7)父类显示初始化(8)父类构造(9)子类显示初始化(10)子类构造

    标题 静态代码块与静态成员变量还要看代码的先后顺序 看程序,说出结果 结果为: x=0 看程序,说出结果 结果如下: 补充 : 静态代码块:static{ } 在JVM加载时即执行,先于主方法执行,用 ...

  4. OC和C++的混用2

    苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就可以在Objective-C应用程序中使用 ...

  5. MFC里 显示设备上下文CClient dc(this) 和 CPaintDC dc(this)

    1 CPaintDC类(1)CPaintDC类是CDC类的一个派生类,该类一般用在响应WM_PAINT消息的函数OnPaint()中.(2)WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消 ...

  6. [vijos]P1979 NOIP2015 信息传递

    描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 TiTi 的同学. 游戏开始时,每人都只知道 ...

  7. 【上下界网络流 二分】bzoj2406: 矩阵

    感觉考试碰到上下界网络流也还是写不来啊 Description Input 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. Output 第一行,输出 ...

  8. html5新结构标签

    html5新结构标签 <header>  定义 section 或 page 的页眉,也就是定义头部的标签. <footer> 定义 section 或 page 的页脚. & ...

  9. H5(一)H5与HTML、XHTML的不同

    一.基本概念 html:超文本标记语言 (Hyper Text Markup Language) xhtml:可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上 ...

  10. Python json和simplejson的使用

    在Python中,json数据和字符串的转换可以使用json模块或simplejson模块. json从Python2.6开始内置到了Python标准库中,我们不需要安装即可直接使用. simplej ...