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

线段树

时间:2016-07-01 21:28:57      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

ACM大牛的线段树总结。看完就懂了。(代码也是抄自那里。。

hdu1166 (基本线段树(然后表示不明白为什么输出优化WA了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define qwq(x) for(edge *o=head[x];o;o=o->next)
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
int read(){
	int x=0;char c=getchar();bool f=true;
	while(!isdigit(c)) {
		if(c==‘-‘) f=false;c=getchar();
	}
	while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
	return f?x:-x;
}
void print(int x){
	char ch[10];int cur=0;
	if(x<0) putchar(‘-‘),x=-x;
	while(x) ch[++cur]=x%10+‘0‘,x/=10;
	for(int i=cur;i;i--) putchar(ch[i]);
	putchar(‘\n‘);
	return ;
}
const int nmax=50005;
const int inf=0x7f7f7f7f;
int sum[nmax<<2];
void pushup(int x){
	sum[x]=sum[x<<1]+sum[x<<1|1];return ;
}
int query(int l,int r,int x,int tl,int tr){
	if(tl<=l&&tr>=r) return sum[x];
	int m=(l+r)>>1;int tmp=0;
	if(tl<=m) tmp+=query(lson,tl,tr);
	if(tr>m) tmp+=query(rson,tl,tr);
	return tmp;
}
void build(int l,int r,int x){
	if(l==r) {
		sum[x]=read();return ;
	}
	int m=(l+r)>>1;
	build(lson);build(rson);pushup(x);
}
void update(int l,int r,int x,int p,int add){
	if(l==r) {
		sum[x]+=add;return ;
	}
	int m=(l+r)>>1;
	p<=m?update(lson,p,add):update(rson,p,add);
	pushup(x);
}
int main(){
	int t=read();
	rep(i,t){
		printf("Case %d:\n",i);
		int n=read();
		build(1,n,1);
		char c[10];
		while(scanf("%s",c)){
			if(c[0]==‘E‘) break;
			int a=read(),b=read();
			if(c[0]==‘Q‘) printf("%d\n",query(1,n,1,a,b));//print(query(1,n,1,a,b));
			else if(c[0]==‘S‘) update(1,n,1,a,-b);
			else update(1,n,1,a,b);
		}
	}
	return 0;
}

 

线段树

标签:

原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5634252.html

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