hdu 1166 敌兵布阵

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1166


还是线段树入门题。。和1754类似。。

细节都没怎么考虑就AC了。。。开始还以为在减人数的时候应该要考虑的在细致一点的。哪知道不用。

下面是AC代码:

#include<iostream>
using namespace std;
#define N 50002
struct node
{
	int l,m,r;
	int num;
}trie[N*3];
void creat(int id,int beg,int end)
{
	trie[id].l=beg;
	trie[id].r=end;
	trie[id].num=0;
	trie[id].m=(beg+end)>>1;
	if(beg<end)
	{
		creat(id*2,trie[id].l,trie[id].m);
		creat(id*2+1,trie[id].m+1,trie[id].r);
	}
}
void update(int id,int goal,int val)
{
	if(trie[id].l==goal&&trie[id].r==goal)
	{
		trie[id].num+=val;
		return ;
	}
	else
	{
		if(trie[id].m>=goal)
		{
			trie[id].num+=val;
			update(id*2,goal,val);          //在左子树
		}
		else
		{
			trie[id].num+=val;
			update(id*2+1,goal,val);        //在右子树
		}
	}
}
void find(int id,int beg,int end,int &max)
{
	if(trie[id].l==beg&&trie[id].r==end)
	{
			max+=trie[id].num;
	}
	else
	{
		if(trie[id].m>=end)         
		{
			find(id*2,beg,end,max);
		}
		else if(trie[id].m<beg)
		{
			find(id*2+1,beg,end,max);
		}
		else
		{
			find(id*2,beg,trie[id].m,max);
			find(id*2+1,trie[id].m+1,end,max);
		}
	}

}
int main()
{
	int n,i,t,a,b,ai;
	int k=1;
	char c[10];
	cin>>t;
	while(t--)
	{
		cin>>n;
		creat(1,1,n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&ai);
			update(1,i,ai);
		}
	
		printf("Case %d:\n",k++);
		while(1)
		{
			scanf("%s",c);
			if(strcmp("End",c)==0)
				break;

			if(strcmp("Add",c)==0)
			{
				scanf("%d%d",&a,&b);
				update(1,a,b);
			}
			if(strcmp("Sub",c)==0)
			{
				scanf("%d%d",&a,&b);
				update(1,a,-b);

			}
			if(strcmp("Query",c)==0)
			{
				scanf("%d%d",&a,&b);
				int max=0;
				find(1,a,b,max);
				printf("%d\n",max);
			}
		}

	}
	return 0;
}


你可能感兴趣的:(hdu 1166 敌兵布阵)