zoukankan      html  css  js  c++  java
  • 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;
    }
    


     

  • 相关阅读:
    ABP Xunit单元测试 第五篇
    ABP 异常处理 第四篇
    ABP Quartz 作业调度第三篇
    ABP 权限拦截 第二篇
    ABP .NET corej 版本 第一篇
    Vue生命周期
    vue中的import、export、requre的区别
    ES6最新语法
    Vux项目搭建
    对象克隆
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134152.html
Copyright © 2011-2022 走看看