zoukankan      html  css  js  c++  java
  • hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)

    单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来。

    http://acm.hdu.edu.cn/showproblem.php?pid=1166

    update单点更新,query区域求和。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define N 200001
    using namespace std;
    struct node
    {
        int l,r;
        __int64 w;
    } q[4*N];
    void pushup(int rt)
    {
        q[rt].w=q[rt*2].w+q[rt*2+1].w;
    }
    void build(int l,int r,int rt)
    {
        q[rt].l=l;
        q[rt].r=r;
        q[rt].w=0;
        if(l==r)
        {
            scanf("%I64d",&q[rt].w);
            return ;
        }
        build(l,(l+r)/2,rt*2);
        build((l+r)/2+1,r,rt*2+1);
        pushup(rt);
    }
    void update(int sum,int key,int l,int r,int rt)
    {
        if(sum<l||sum>r)
            return ;
        if(l==r&&sum==l)
        {
            q[rt].w+=(__int64)key;
            return ;
        }
        update(sum,key,l,(l+r)/2,rt*2);
        update(sum,key,(l+r)/2+1,r,rt*2+1);
        pushup(rt);
    }
    __int64 query(int ll,int rr,int l,int r,int rt)
    {
        if(ll>r||rr<l) return 0;
        if(ll<=l&&rr>=r)
        {
            return q[rt].w;
        }
        return query(ll,rr,l,(l+r)/2,rt*2)+query(ll,rr,(l+r)/2+1,r,rt*2+1);
    }
    int main()
    {
        int n,sum1,sum2,T,K=0;
        char a[10];
        scanf("%d",&T);
        while(T--)
        {
            K++;
            scanf("%d",&n);
            build(1,n,1);
            printf("Case %d:
    ",K);
            while(scanf("%s",a)!=EOF)
            {
                if(strcmp(a,"End")==0) break;
                else if(strcmp(a,"Query")==0)
                {
                    scanf("%d%d",&sum1,&sum2);
                    __int64 t=query(sum1,sum2,1,n,1);
                    printf("%I64d
    ",t);
                }
                else if(strcmp(a,"Sub")==0)
                {
                    scanf("%d%d",&sum1,&sum2);
                    update(sum1,-sum2,1,n,1);
    
                }
                else if(strcmp(a,"Add")==0)
                {
                    scanf("%d%d",&sum1,&sum2);
                    update(sum1,sum2,1,n,1);
                }
            }
    
        }
        return 0;
    }

    http://acm.hdu.edu.cn/showproblem.php?pid=1754

    update单点替换,query区间最值

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define N 200001
    using namespace std;
    struct node
    {
        int l,r;
        __int64 w;
    }q[4*N];
    void pushup(int rt)
    {
        q[rt].w=max(q[rt*2].w,q[rt*2+1].w);
    }
    void build(int l,int r,int rt)
    {
        q[rt].l=l;
        q[rt].r=r;
        q[rt].w=0;
        if(l==r)
        {
            scanf("%I64d",&q[rt].w);
            return ;
        }
        build(l,(l+r)/2,rt*2);
        build((l+r)/2+1,r,rt*2+1);
        pushup(rt);
    }
    void update(int sum,int key,int l,int r,int rt)
    {
        if(sum<l||sum>r)
            return ;
        if(l==r&&sum==l)
        {
            q[rt].w=(__int64)key;
            return ;
        }
        update(sum,key,l,(l+r)/2,rt*2);
        update(sum,key,(l+r)/2+1,r,rt*2+1);
        pushup(rt);
    }
    __int64 query(int ll,int rr,int l,int r,int rt)
    {
        if(ll>r||rr<l) return 0;
        if(ll<=l&&rr>=r)
        {
            return q[rt].w;
        }
        return max(query(ll,rr,l,(l+r)/2,rt*2),query(ll,rr,(l+r)/2+1,r,rt*2+1));
    }
    int main()
    {
        int n,m,sum1,sum2;
        char a[3];
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            build(1,n,1);
            while(m--)
            {
                scanf("%s%d%d",a,&sum1,&sum2);
                if(a[0]=='U')
                {
                    update(sum1,sum2,1,n,1);
                }
                else if(a[0]=='Q')
                {
                    __int64 t=query(sum1,sum2,1,n,1);
                    printf("%I64d
    ",t);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    PHP中使用CURL实现GET和POST请求
    ecstore关于smarty语法调用
    Linux 定时任务详解
    fzu 1753 Another Easy Problem
    zoj 2562 More Divisors
    poj 2992 Divisors
    UVA10078多边形判断凹凸性
    UVA10002求凸包的质心
    UVA10088多边形内整点个数计算(计算几何)
    HDU 1824 简单2-sat
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3902525.html
Copyright © 2011-2022 走看看