码迷,mamicode.com
首页 > 其他好文 > 详细

模版 单点修改,区间查询

时间:2020-06-05 23:02:21      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:push   else   ble   模板   shu   href   show   单点   +=   

模板一:单点修改,区间求和
????模板题:hdu1166 敌兵布阵

const int maxn=100010;
int a[maxn],tree[4*maxn];

void pushup(int o){
	tree[o]=tree[o<<1]+tree[o<<1|1];
}

void build(int o,int l,int r){
	if(l==r){
		tree[o]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(o<<1,l,mid);
	build(o<<1|1,mid+1,r);
	pushup(o);
}

void change(int o,int l,int r,int x,int k){
	if(l==r){
		tree[o]+=k;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid) change(o<<1,l,mid,x,k);
	else change(o<<1|1,mid+1,r,x,k);
	pushup(o);
}

int query(int o,int l,int r,int ql,int qr){
	if(ql<=l && r<=qr) return tree[o];
	int mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans+=query(o<<1,l,mid,ql,qr);
	if(qr>mid) ans+=query(o<<1|1,mid+1,r,ql,qr);
	return ans; 
}

模板二:单点修改,区间最值
????模板题:hdu1754 I Hate It

const int maxn=100010;
int a[maxn],tree[4*maxn];

void pushup(int o){
	tree[o]=max(tree[o<<1],tree[o<<1|1]);
}

void build(int o,int l,int r){
	if(l==r){
		tree[o]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(o<<1,l,mid);
	build(o<<1|1,mid+1,r);
	pushup(o);
}

void change(int o,int l,int r,int x,int k){
	if(l==r){
		tree[o]=k;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid) change(o<<1,l,mid,x,k);
	else change(o<<1|1,mid+1,r,x,k);
	pushup(o);
}

int query(int o,int l,int r,int ql,int qr){
	if(ql<=l && r<=qr) return tree[o];
	int mid=(l+r)>>1,ans=-1;
	if(ql<=mid) ans=max(ans,query(o<<1,l,mid,ql,qr));
	if(qr>mid) ans=max(ans,query(o<<1|1,mid+1,r,ql,qr));
	return ans; 
}

模版 单点修改,区间查询

标签:push   else   ble   模板   shu   href   show   单点   +=   

原文地址:https://www.cnblogs.com/fxq1304/p/13052618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!