关闭

杭电 1166

577人阅读 评论(0) 收藏 举报

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

没有人带领就是没办法 啊

悲剧········

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;
}


 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:152730次
    • 积分:2104
    • 等级:
    • 排名:第18100名
    • 原创:71篇
    • 转载:7篇
    • 译文:0篇
    • 评论:24条
    最新评论