先冷静一下 线段树单点更新HDU1166 敌兵布阵

由于很久很久以前做过线段树 所以现在只是挑几道复习一下,如果需要题目可以到http://blog.csdn.net/yrhsilence/article/details/5793699

由于本人被一个傻逼问题气到了=_=,而且刚好看到一个挺好的博客介绍线段树,So
http://blog.csdn.net/x314542916/article/details/7837276
(别打我
傻逼问题就是之前我的宏定义是#define max(a,b) (a>b?a:b)
这里会有一个问题就是max(a,max(b,c))的时候会变成
a>b>c?b:c?:a:b
可以自行运行一下(之前以为就算不加括号应该不会有什么影响这里写图片描述

#include<stdio.h>
#define max(a,b) a>b?a:b
int main()
{
    printf("%d\n",max(1,max(3,max(4,5))));
}
/* 运行结果: 3 */
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define rfor(i,a,b) for(i=a;i<=b;++i)
#define lfor(i,a,b) for(i=a;i>=b;--i)
#define sfor(i,a,h) for(i=h[a];i!=-1;i=e[i].next)
#define mem(a,b) memset(a,b,sizeof(a))
#define mec(a,b) memcpy(a,b,sizeof(b))
#define cheak(i) printf("%d ",i)
#define min(a,b) (a>b?b:a)
#define max(a,b) (a>b?a:b)
#define inf 0x7fffffff
typedef long long LL;
#define maxn 50005
int s[maxn],tree[maxn*4];
char str[10];
void build(int l,int r,int index)
{
    if(l==r) 
    {
        tree[index]=s[l];
        return ;
    }
    int mid=(l+r)/2;
    build(l,mid,index*2);
    build(mid+1,r,index*2+1);
    tree[index]=tree[index*2]+tree[index*2+1];
}
void insert(int l,int r,int pos,int val,int index)
{
    if(l==r&&l==pos)
    {
        tree[index]+=val;
        return ;
    }
    int mid=(l+r)/2;
    if(pos>mid) insert(mid+1,r,pos,val,index*2+1);
    else insert(l,mid,pos,val,index*2);
    tree[index]=tree[index*2]+tree[index*2+1];
}
int query(int l,int r,int left,int right,int index)
{
    if(left<=l&&right>=r)
    return tree[index];
    int mid=(l+r)/2;
    if(left>mid)
    return query(mid+1,r,left,right,index*2+1);
    else if(right<=mid)
    return query(l,mid,left,right,index*2);
    else
    {
        int sum=0;
        sum=query(l,mid,left,right,index*2);
        sum+=query(mid+1,r,left,right,index*2+1);
        return sum;
    }
}
int main()
{
    int T,i,n,a,b,o=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        rfor(i,1,n)
        scanf("%d",&s[i]);
        build(1,n,1);
        printf("Case %d:\n",++o);
        while(1)
        {
            scanf("%s",str);
            if(!strcmp(str,"End")) break;
            scanf("%d%d",&a,&b);
            if(!strcmp(str,"Add"))
            insert(1,n,a,b,1);
            else if(!strcmp(str,"Sub"))
            insert(1,n,a,-b,1);
            else printf("%d\n",query(1,n,a,b,1));
        }
    }
    return 0;
} 

你可能感兴趣的:(先冷静一下 线段树单点更新HDU1166 敌兵布阵)