hdu1166线段树水题

线段树很有用噢!

多练练,lazy思想是什么呢,下一题学一下。

题意:对一个数组进行更改,和查询区间之和.

#include<iostream>
#include<cstdio>
using namespace std;

struct segtree
{
    int l;
    int r;
    int mid;
    int max;
    int sum;
}T[600011];


int max(int a,int b)
{
    return a>b?a:b;
}


void construct(int l,int r,int k)  //二叉树
{
    T[k].l=l;
    T[k].r=r;
    T[k].mid=(l+r)/2;
    //T[k].max=-1;
    T[k].sum=0;


    if(l==r)    return ;

    construct(l,T[k].mid,2*k);
    construct(T[k].mid+1,r,2*k+1);
}


void insert(int n,int d,int k)
{
    //if(T[k].l==T[k].r&&T[k].l==d)   {T[k].max=n;return ;}   //元线段处理
    if(T[k].l==T[k].r&&T[k].l==d)   {T[k].sum+=n;return ;}
                                                        //查找该插入的位置
    if(d<=T[k].mid)  insert(n,d,2*k);
    else            insert(n,d,2*k+1);
    T[k].sum=T[2*k].sum+T[2*k+1].sum;             //给该线段节点更新sum
}


int ans;
void search(int l,int r,int k)              //类似深搜
{
    //if(T[k].l==l&&T[k].r==r)    {ans=max(ans,T[k].max);return ;}
    if(T[k].l==l&&T[k].r==r)    {ans+=T[k].sum;return ;}

    if(r<=T[k].mid)      search(l,r,2*k);
    else if(l>T[k].mid)  search(l,r,2*k+1);
    else
    {
        search(l,T[k].mid,2*k);
        search(T[k].mid+1,r,2*k+1);
    }
}


int main()
{
    int n,m;
    int temp;
    int i;
    int T;
    int a,b,t;
    cin>>T;
    t=T;
    while(T--)
    {
        scanf("%d",&n);
        construct(1,n,1);
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            insert(x,i,1);
        }
        printf("Case %d:\n",(t-T));
        char s[8];
        while(1)
        {
            getchar();
            scanf("%s",s);
            if(s[0]=='E') break;
            scanf("%d%d",&a,&b);
            if(s[0]=='Q')
            {
                if(a>b)swap(a,b);
                ans=0;
                search(a,b,1);
                printf("%d\n",ans);
            }
            if(s[0]=='A')
            {
                insert(b,a,1);
            }
            if(s[0]=='S')
            {
                insert(-b,a,1);
            }
        }
    }
    return 0;
}


 

原文地址:https://www.cnblogs.com/amourjun/p/5134152.html