hdu 1166 敌兵布阵--线段树

/*
	线段树题
	这题很简单,但是老是Runtime Error(ACCESS_VIOLATION)
	一直找不到,就看着一老兄的,改我的代码
	一直把他的函数都搬过来了,还是那样
	就又把输入部分抄了过来,这才对了
	原来是处理'\n'的时候出的错
	但是在我的机器上一切正常
	其实可以无视'\n'或用" %s"空白字符处理
*/
#include<stdio.h>
#include<string.h>
struct node
{
	int l,r,zhi;
}e[200000];
int num=1,SUM;

char s[20];

void jian(int i,int j,int no)
{
	int mid=(i+j)/2;
	e[no].l=i;
	e[no].r=j;
	e[no].zhi=0;
	if(i!=j)
	{
		jian(i,mid,2*no);
		jian(mid+1,j,2*no+1);
	}
}

/*
void make(int x,int y,int num)//别人的
{
	e[num].l=x;
	e[num].r=y;
	if (x==y)
		e[num].zhi=r[y];
	else 
	{
		make(x,(x+y)/2,num+num);
		make((x+y)/2+1,y,num+num+1);
		e[num].zhi=e[num+num].zhi+e[num+num+1].zhi;
	}
}
*/
void cha(int i,int zhi,int no)
{
	int mid=(e[no].l+e[no].r)/2;
	e[no].zhi+=zhi;
	if(e[no].l==i&&e[no].r==i)
		return ;
	if(i<=mid)
		cha(i,zhi,2*no);
	else cha(i,zhi,2*no+1);
}

/*
void add(int x,int y,int num)//别人的
{
	e[num].zhi+=y;
	if (e[num].l==x && e[num].r==x)
		return;
	if (x>(e[num].l+e[num].r)/2)
		add(x,y,num+num+1);
	else
		add(x,y,num+num);
}
void sub(int x,int y,int num)//别人的
{
	e[num].zhi-=y;
	if (e[num].l==x && e[num].r==x)
		return;
	if (x>(e[num].l+e[num].r)/2)
		sub(x,y,num+num+1);
	else sub(x,y,num+num);
}
*/
int he(int i,int j,int no)
{
	int mid=(e[no].l+e[no].r)/2;
	if(i==e[no].l&&j==e[no].r)
		return e[no].zhi;
	if(j<=mid)
		return he(i,j,2*no);
	else if(i>mid)
		return he(i,j,2*no+1);
	else
		return he(i,mid,2*no)+he(mid+1,j,2*no+1);

}
/*
void que(int x,int y,int num)//别人的
{
	if (x<=e[num].l && y>=e[num].r) 
		SUM+=e[num].zhi;
	else 
	{
		if (x>(e[num].l+e[num].r)/2)
			que(x,y,num+num+1);
		else if (y<=(e[num].l+e[num].r)/2)
			que(x,y,num+num);
		else 
		{
			que(x,y,num+num);
			que(x,y,num+num+1);
		}
	}
}*/
int main()
{
	int t,n,i,a,b;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		jian(1,n,1);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a);
			cha(i,a,1);
		}

		printf("Case %d:\n",num++);
		
		char c;
		/*c=getchar();//这个有没有无所谓*/
		while(scanf("%s",s))
		{
			if(strcmp(s,"End")==0)
				break;
			else if(strcmp(s,"Add")==0)
			{
				scanf("%d%d",&a,&b);
				cha(a,b,1);
				/*c=getchar();//有这个就错了*/
			}
			else if(strcmp(s,"Sub")==0)
			{
				scanf("%d%d",&a,&b);
				cha(a,-b,1);
				/*c=getchar();//有这个就错了*/
			}
			else
			{
				scanf("%d%d",&a,&b);
				printf("%d\n",he(a,b,1));
				/*c=getchar();//有这个就错了*/
			}
		}
		/*
		while (scanf(" %s",s)!=EOF)//别人的
		{
			if (strcmp(s,"End")==0) break;
			scanf("%d %d",&a,&b);
			if (strcmp(s,"Query")==0)
			{
				SUM=0;
				
				printf ("%d\n",he(a,b,1));
			}
			else if (strcmp(s,"Add")==0)
				cha(a,b,1);
			else 
				cha(a,-b,1);
		}
		*/
	}
	return 0;
}

 

你可能感兴趣的:(c,IE,query,Access)