敌国布阵(线段树)

#include<stdio.h>
#define maxn 50005
struct Tree{
   int left,right,sum;       
}tr[maxn*3];
int array[maxn];

void build(int l,int r,int now)
{
   tr[now].left=l; tr[now].right=r;
   if(l==r)
   {
     tr[now].sum=array[l];
     return;
   }  
   int mid=(l+r)/2;
   build(l,mid,now*2);
   build(mid+1,r,(now*2)+1);
   tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;
}

void update(int now,int goal,int add)
{
  if(tr[now].left==tr[now].right)
  {  tr[now].sum+=add; return ;} 
  int mid=(tr[now].left+tr[now].right)/2;
  if(goal<=mid)
  {
     update(now*2,goal,add);        
  }  
  else
     update(now*2+1,goal,add);
  tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;
}
int query(int start,int end,int now)
{
     if(start<=tr[now].left && tr[now].right<=end)
     { return tr[now].sum;}
     int ans=0;
     int mid=(tr[now].left+tr[now].right)/2;
     if(start<=mid)
     {
       ans+=query(start,end,now*2);         
     }
     if(end>mid)
      ans+=query(start,end,now*2+1);
     
     return ans;
}
int main()
{
   int t,i,j,k,n,a,b,p,number;
   char str[10];
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   scanf("%d",&t);
   for(k=1;k<=t;k++)
   {
      printf("Case %d:\n",k);
       scanf("%d",&n);
       for(i=1;i<=n;i++)
        scanf("%d",&array[i]);
       build(1,n,1);  
       //for(i=1;i<=n*3;i++)
       // printf("%d %d %d\n",tr[i].left,tr[i].right,tr[i].sum);
       // printf("\n................\n");
       while(scanf("%s",str))
       {
         if(str[0]=='E')
          break;
         if(str[0]=='Q') 
         { 
           scanf("%d %d",&a,&b);
           printf("%d\n",query(a,b,1));
           
         }  
         if(str[0]=='A')
         {
           scanf("%d %d",&p,&number);
           update(1,p,number);           
         }
         if(str[0]=='S')  
         {
           scanf("%d %d",&p,&number);
           update(1,p,-number);           
         }               
       }           
   } 
}

再次复习线段树,主要是改善风格和完善代码。

#include <stdio.h>
#include <string.h>
#define maxn 50050
#define lson l , m , rt*2
#define rson m+1 , r , rt*2+1
int n;
int sum[maxn<<2];
int in[maxn];
void PushUp(int rt){
	sum[rt]	= sum[rt*2] + sum[rt*2+1];
}
void build(int l, int r, int rt)
{
	if(l == r) {
		sum[rt] = in[l];
		return ;
	}
	int m = (l + r)	/ 2;
	build(lson);
	build(rson);
	PushUp(rt);
}
int query(int L,int R,int l,int r,int rt)
{
	if(L <= l && r <= R)
		return sum[rt];
	int m = (l + r) / 2;
	int ret = 0;
	if(L <= m) ret += query(L,R,lson);
	if(R > m) ret += query(L,R,rson);
	return ret;
}
void update(int index,int add,int l,int r,int rt)
{
	if(l == r){
		sum[rt] += add;
		return ;
	}	
	int m = (l + r) / 2;
	if(index <= m) update(index ,add ,lson);
	else update(index ,add , rson);
	PushUp(rt);
}
int main()
{
	int T,i,cas=1;
	char op[10];
	scanf("%d",&T);
	while(T--)
	{
		printf("Case %d:\n",cas++);
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			scanf("%d",&in[i]);
		getchar();
		build(1,n,1);
	
		while(scanf("%s",op))
		{
			if(op[0]=='E')
				break;
			int a,b;
			scanf("%d%d",&a,&b);
			if(op[0]=='Q')	printf("%d\n",query(a,b,1,n,1));
			else if(op[0] == 'S') update(a,-b,1,n,1);
			else update(a,b,1,n,1);
 		}
 	
	}	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值