完整版线段树求最小值,支持区间减
来源:互联网 发布:java培训大纲 编辑:程序博客网 时间:2024/05/02 12:51
def Min(a,b):
if a<b:
return a
else:
return b
class node:
def __init__(self,x,y):
self.l=x
self.r=y
self.key=0
self.lazy=0
if x<y:
mid=(x+y)/2
self.left=node(x,mid)
self.right=node(mid+1,y)
def Set(p,x,y):
if p.l==p.r:
p.key=y
return
mid=(p.l+p.r)/2
if x<=mid:
p.left.Set(x,y)
else:
p.right.Set(x,y)
p.key=Min(p.left.key,p.right.key)
def calc(p,x,y):
if p.l==x and p.r==y:
return p.key-p.lazy
if p.lazy!=0:
p.key=p.key-p.lazy
p.left.lazy=p.left.lazy+p.lazy
p.right.lazy=p.right.lazy+p.lazy
p.lazy=0
mid=(p.l+p.r)/2
if mid>=y:
return p.left.calc(x,y)
elif mid<x:
return p.right.calc(x,y)
else:
return Min(p.left.calc(x,mid),p.right.calc(mid+1,y))
p.key=Min(p.left.key-p.left.lazy,p.right.key-p.right.lazy)
def change(p,x,y,z):
if p.l==x and p.r==y:
p.lazy=p.lazy+z
return
if p.lazy!=0:
p.key=p.key-p.lazy
p.left.lazy=p.left.lazy+p.lazy
p.right.lazy=p.right.lazy+p.lazy
p.lazy=0
mid=(p.l+p.r)/2
if mid>=y:
p.left.change(x,y,z)
elif mid<x:
return p.right.change(x,y,z)
else:
p.left.change(x,mid,z)
p.right.change(mid+1,y,z)
p.key=Min(p.left.key-p.left.lazy,p.right.key-p.right.lazy)
A=[]
N=int(input("N:"))
Q=int(input("Q:"))
Tree=node(1,N)
for i in range(0,N):
x=int(input("A"+str(i)+":"))
A.append(x)
Tree.Set(i+1,x)
for i in range(0,Q):
x=raw_input("code"+str(i)+":")
if x=="Q":
X=int(input("X:"))
Y=int(input("Y:"))
print Tree.calc(X,Y)
else :
X=int(input("X:"))
Y=int(input("Y:"))
Z=int(input("Z:"))
Tree.change(X,Y,Z)
if a<b:
return a
else:
return b
class node:
def __init__(self,x,y):
self.l=x
self.r=y
self.key=0
self.lazy=0
if x<y:
mid=(x+y)/2
self.left=node(x,mid)
self.right=node(mid+1,y)
def Set(p,x,y):
if p.l==p.r:
p.key=y
return
mid=(p.l+p.r)/2
if x<=mid:
p.left.Set(x,y)
else:
p.right.Set(x,y)
p.key=Min(p.left.key,p.right.key)
def calc(p,x,y):
if p.l==x and p.r==y:
return p.key-p.lazy
if p.lazy!=0:
p.key=p.key-p.lazy
p.left.lazy=p.left.lazy+p.lazy
p.right.lazy=p.right.lazy+p.lazy
p.lazy=0
mid=(p.l+p.r)/2
if mid>=y:
return p.left.calc(x,y)
elif mid<x:
return p.right.calc(x,y)
else:
return Min(p.left.calc(x,mid),p.right.calc(mid+1,y))
p.key=Min(p.left.key-p.left.lazy,p.right.key-p.right.lazy)
def change(p,x,y,z):
if p.l==x and p.r==y:
p.lazy=p.lazy+z
return
if p.lazy!=0:
p.key=p.key-p.lazy
p.left.lazy=p.left.lazy+p.lazy
p.right.lazy=p.right.lazy+p.lazy
p.lazy=0
mid=(p.l+p.r)/2
if mid>=y:
p.left.change(x,y,z)
elif mid<x:
return p.right.change(x,y,z)
else:
p.left.change(x,mid,z)
p.right.change(mid+1,y,z)
p.key=Min(p.left.key-p.left.lazy,p.right.key-p.right.lazy)
A=[]
N=int(input("N:"))
Q=int(input("Q:"))
Tree=node(1,N)
for i in range(0,N):
x=int(input("A"+str(i)+":"))
A.append(x)
Tree.Set(i+1,x)
for i in range(0,Q):
x=raw_input("code"+str(i)+":")
if x=="Q":
X=int(input("X:"))
Y=int(input("Y:"))
print Tree.calc(X,Y)
else :
X=int(input("X:"))
Y=int(input("Y:"))
Z=int(input("Z:"))
Tree.change(X,Y,Z)
- 完整版线段树求最小值,支持区间减
- 【线段树】 求区间最小值以及区间最小值
- 动态区间最小值查询,支持点设置,线段树
- poj 2823 线段树 求固定区间的最大最小值
- 线段树求区间最大值和最小值(指针)
- 线段树求区间最大值与最小值的差
- poj2823------线段树-------求区间最大最小值(RMQ)
- poj3264(线段树求区间最大最小值)
- POJ3264(线段树求区间最大值和最小值)
- POJ 3264(线段树求区间内最大值和最小值)
- 线段树 理解,求解数组区间求和,求最小值
- 模板:线段树求区间最大/最小值及下标
- 动态区间最大值最小值区间和查询,支持区间设置,线段树
- 【自用】线段树 区间最小值
- noj1042(线段树,区间最小值)
- Uva 12299 线段树求区间最小值(RMQ) 区间查询单点更新
- hihoCoder 1077 RMQ问题再临-线段树 单点修改,求区间最小值
- poj 2823 Sliding Window (线段树 求固定区间的最大最小值 )
- java经典算法_018有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- javascript 继承(extend)
- Hive UDTF and LateralView
- Fedora16配置samba Vstftp NFS
- Peripheral Port Memory Remap Register
- 完整版线段树求最小值,支持区间减
- POJ2992 Divisors
- Ping工具
- 单调栈
- android开发中代码片段集合 (二)
- Dick and Jane
- 求n个数中最大的k个数
- linux 内核 队列 kfifo
- linux内核移植到tiny6410(2)