midle110

每天都在进步

杭电 1166

最近搞算法,唉,一个人慢慢的弄,有时候看了一天都不知道怎么回事

没有人带领就是没办法 啊

悲剧········

1166  弄了半天

终于弄出来了

有一个在scanf("%s",str);前面加了一个getchar()

能够正常现实,但是就是wrong

最后查出来了

坑爹··········

 

杭电 1166

是线段树算法

 

 

#include "stdio.h"

struct node 
{
	int l,r,sum;
}no[3*50005];

int ks[50005];

int t1,t2;

void build_tree(int a,int b,int c)
{
	no[c].l = a ; 
	no[c].r = b ;
	if (a == b)
	{
		no[c].sum = ks[a];
		return ;
	}
	int mid =(a + b) >> 1 ;
	build_tree(a , mid , 2*c);
	build_tree(mid+1 , b , 2*c+1);
	no[c].sum = no[2*c].sum + no[2*c+1].sum;
}

void add_sub(int a,int b,int c)
{
	if (a == b )
	{
		no[c].sum += t2;
		return ;
	}

	int mid = (a + b ) >> 1;
	if (t1 <= mid )
	{
		add_sub(a , mid , 2*c );
	}
	else
		add_sub(mid +1 , b , 2*c+1 );
	no[c].sum = no[2*c].sum + no[2*c+1].sum ;
}

int find_tree(int a, int b,int c)
{
	if ((no[c].l == a )&& (no[c].r == b ))
	{
		return no[c].sum;
	}
	int mid = (no[c].l + no[c].r) >> 1 ;

	if (b <= mid)
	{
		find_tree(a , b , 2*c);
	}
	else
		if (a > mid)
		{
			find_tree(a , b , 2*c+1);
		}
		else
			return (find_tree(a, mid , 2*c) + find_tree(mid+1 , b , 2*c+1) );
}


int main(int argc, char* argv[])
{
	int n,index,cases = 0 ;
	char str[10];
	scanf("%d",&index);
	while (index--)
	{
		cases++;
		scanf("%d",&n);
		for (int i =1 ; i <= n ; ++i )
		{
			scanf("%d",&ks[i]);
		}
		build_tree(1 , n , 1 );
		printf("Case %d:\n",cases);
		while (scanf("%s",str))
		{
			if (str[0] == 'A')
			{
				scanf("%d%d",&t1,&t2);
				add_sub(1, n , 1 );
			}
			else
				if (str[0] == 'S')
				{
					scanf("%d%d",&t1,&t2);
					t2 = 0 - t2 ;
					add_sub(1, n, 1);
				}
				else
					if (str[0] == 'Q')
					{
						scanf("%d%d",&t1,&t2);
						printf("%d\n",find_tree(t1 , t2 ,1));
					}
					else
						break;
		}
	}
	return 0;
}


 

 

阅读更多
文章标签: tree build c 算法
个人分类: 杭电
想对作者说点什么? 我来说一句

51NOD_1166 大数开平方

51Nod

lwlldd lwlldd

2017-04-24 10:43:58

阅读数:421

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭