hdu 1166 线段树 水题 地兵布阵

越来越感觉算法就是一种方法,一个解决一类问题的公式,当然公式有变形,题也有变形

但只要深刻理解它,变形只是一种顺理而成,只要类比公式,推理一下,将代码变形一下

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

#define MAX 50005

struct trea
{
	int l,r;
	int summ;
}trees[MAX*3];


int num[MAX],n,t;

void biuld(int i,int l,int r)
{
	trees[i].l=l;
	trees[i].r=r;
	if(l==r)
	{
		trees[i].summ=num[l-1];
		return ;
	}
	int mid=(l+r)/2;
	biuld(i*2,l,mid);
	biuld(i*2+1,mid+1,r);
	trees[i].summ=trees[i*2].summ+trees[i*2+1].summ;
}

void add(int i,int l,int m)
{
	trees[i].summ+=m;

	if(trees[i].l==l&&trees[i].r==l)return ;

	int mid=(trees[i].l+trees[i].r)/2;

	if(l<=mid) add(i*2,l,m);
	else add(i*2+1,l,m);
}

int query(int i,int l,int r)
{
	if(trees[i].l==l&&trees[i].r==r)
		return trees[i].summ;
	else
	{
		int mid=(trees[i].l+trees[i].r)/2;

		if(l>mid)return query(i*2+1,l,r);
		else if(r<=mid)return query(i*2,l,r);
		else return query(i*2,l,mid)+query(i*2+1,mid+1,r);
	}
}


int main()
{
	char str[10];

	int k=0,i;

	int a,b;

	scanf("%d",&t);

	while(t--)
	{
		scanf("%d",&n);

		for(i=0;i<n;i++)scanf("%d",&num[i]);

		//for(i=0;i<n;i++)printf("%d\n",num[i]);

		biuld(1,1,n);

		printf("Case %d:\n",++k);

		while(scanf("%s",str))
		{
			if(strcmp(str,"End")==0)
				break;
			scanf("%d%d",&a,&b);
			if(strcmp(str,"Add")==0)add(1,a,b);
			else if(strcmp(str,"Sub")==0)add(1,a,-b);
			else
			{
				printf("%d\n",query(1,a,b));
			}
		}
	}

	return 0;
}

  

就行

posted @ 2012-04-01 18:49  shijiwomen  阅读(238)  评论(0编辑  收藏  举报