现在的位置: 首页 > 综合 > 正文

POJ-3468(线段树_区间更新)

2013年04月22日 ⁄ 综合 ⁄ 共 1497字 ⁄ 字号 评论关闭

我都有点崩溃了,我发现我从来没有将线段树写的成功过,,每次都不是这个毛病就是那个毛病,真的狠烦!

而且我也发现了,如果一直用tree[i]的形式写用以写错,,以后不这么用了,用两个数组好了.

而且如果可以的话,,我还真的需要写成简便的那种写法了,,,.明天再练习一天吧,,其实我的时间真的不多了...

加油

贴出代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

struct Tree{
	int a;
	int b;
	__int64 col;
	__int64 sum;
}tree[444444];

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

void pushdown(int i,int m)
{
	if(tree[i].col)
	{
		tree[i<<1].col+=tree[i].col;
		tree[i<<1|1].col+=tree[i].col;
		tree[i<<1].sum+=(m-(m>>1))*tree[i].col;
		tree[i<<1|1].sum+=(m>>1)*tree[i].col;
		tree[i].col=0;
	}
}


void Buildtree(int i,int a,int b)
{
	tree[i].a=a;
	tree[i].b=b;
	tree[i].col=0;
	if(a==b)
	{
		scanf("%I64d",&tree[i].sum);
		return;
	}
	int mid=(a+b)>>1;
	Buildtree(i<<1,a,mid);
	Buildtree(i<<1|1,mid+1,b);
	pushup(i);
}

void update(int i,int a,int b,int val)
{
	if(a<=tree[i].a&&tree[i].b<=b)
	{
		tree[i].col+=val;
		tree[i].sum+=(tree[i].b-tree[i].a+1)*val;
		return;
	}
	pushdown(i,tree[i].b-tree[i].a+1);
	int mid=(tree[i].a+tree[i].b)>>1;
	if(a<=mid)
		update(i<<1,a,b,val);
	if(b>mid)
		update(i<<1|1,a,b,val);
	pushup(i);
}

__int64 query(int i,int a,int b)
{
	if(a<=tree[i].a&&tree[i].b<=b)
	{
		return tree[i].sum;
	}
	pushdown(i,tree[i].b-tree[i].a+1);
	int mid=(tree[i].a+tree[i].b)>>1;
	__int64 ans=0;
	if(a<=mid)
		ans+=query(i<<1,a,b);
	if(b>mid)
		ans+=query(i<<1|1,a,b);
	return ans;
}

int main()
{
	int N,M;
	scanf("%d%d",&N,&M);
	Buildtree(1,1,N);
	for(int i=1;i<=M;i++)
	{
		char que[5];
		int a,b,val;
		scanf("%s",que);
		if(que[0]=='C')
		{
			scanf("%d%d%d",&a,&b,&val);
			update(1,a,b,val);
		}
		else if(que[0]=='Q')
		{
			scanf("%d%d",&a,&b);
			__int64 ans=query(1,a,b);
			printf("%I64d\n",ans);
		}
	}
	return 0;
}

 

抱歉!评论已关闭.