【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的时候差了一题,当时有思路,但 ...
随机推荐
- ☆☆☆Dojo中define和declare的结合使用
在原生的js中是不可以创建类的,没有class这个关键字,但是在dojo中,dojo自定义了一个模块叫做dojo/_base/declare,用这个模块我们可以创建自己的类,实现面向对象编程. 单继承 ...
- java基础—this关键字
一.this关键字
- Bootstrap历练实例:交替的进度条
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- php常见验证
/** * 文件上传 * @param $file 要上传的文件 * @param $size 大小设置 * @param $ext 文件类型 * @return bool 是否上传成功 */func ...
- shell脚本,awk利用NF来计算文本显示的行数。
解释: 1.awk 'NF{a++;print a,$0;next}1' file4 首先判断NF是否存在值,第一行第二行第三行第四行都存在,进行执行后面的输出,输出后碰到next后,就结束了后面的操 ...
- 直接用bcdedit创建bootmgr数据库和修复启动菜单
直接用bcdedit创建bootmgr数据库和修复启动菜单 使用下面方法之前需要bcdedit和bootsect两条命令,这两条命令可以到vista或者windows 7安装光盘上获得.bootsec ...
- 【状压dp】cf906C. Party
需要稍加分析结论:还有一些小细节 Arseny likes to organize parties and invite people to it. However, not only friends ...
- Python爬虫系列-Requests库详解
Requests基于urllib,比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求. 实例引入 import requests response = requests.get( ...
- JAVA基础篇—基本数据类型
Java8种基本数据类型:4个整型byte 1字节 8bit 范围-128~127 short 2字节 16bit 范围-2^15 -1~2^15 -1 int 4字节 32bit 范围-2^31-1 ...
- LeetCode(200) Number of Islands
题目 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is su ...