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


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值