zoukankan      html  css  js  c++  java
  • HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板
    自己写的第一棵线段树&第一棵树状数组 莫名的兴奋
    线段树:

    #include <cstdio>
    using namespace std;
    int cases,n,tree[200500],ql,qr;
    char s[50];
    void build(int l,int r,int num){
        if(l==r){scanf("%d",&tree[num]);return;}
        int mid=(l+r)/2;
        build(l,mid,num*2);
        build(mid+1,r,num*2+1);
        tree[num]=tree[2*num]+tree[2*num+1];
    }
    int qu(int l,int r,int num){
        if(ql<=l&&qr>=r)return tree[num];
        int mid=(l+r)/2,sum=0;
        if(mid>=ql)sum+=qu(l,mid,num*2);
        if(mid<qr)sum+=qu(mid+1,r,num*2+1);
        return sum;
    }
    void add(int l,int r,int num){
        if(l==r){tree[num]+=qr;return;}
        int mid=(l+r)/2;
        if(mid>=ql)add(l,mid,num*2);
        if(mid<ql)add(mid+1,r,num*2+1);
        tree[num]=tree[2*num]+tree[2*num+1];
    }
    int main()
    {
        scanf("%d",&cases);
        for(int ii=1;ii<=cases;ii++){
            printf("Case %d:
    ",ii);
            scanf("%d",&n);
            build(1,n,1);
            while(scanf("%s",s)&&s[0]!='E'){
                scanf("%d%d",&ql,&qr);
                if(s[0]=='Q')printf("%d
    ",qu(1,n,1));
                else if(s[0]=='A')add(1,n,1);
                else if(s[0]=='S')qr=-qr,add(1,n,1);
            }
        }
    }

    树状数组:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    int cases,n,a[50005],c[50005];
    char s[50];
    int lowbit(int x){return x&(-x);}
    void add(int x,int v)
    {
        while(x<=n)
        {
            c[x]+=v;
            x+=lowbit(x);
        }
    }
    int find(int x)
    {
        int ans=0;
        while(x>0)
        {
            ans+=c[x];
            x-=lowbit(x);
        }
        return ans;
    }
    int main()
    {
        scanf("%d",&cases);
        for(int ii=1;ii<=cases;ii++)
        {
            printf("Case %d:
    ",ii);
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                add(i,a[i]);
            }
            while(scanf("%s",s)&&s[0]!='E')
            {
                register int xx,yy;
                scanf("%d%d",&xx,&yy);
                if(s[0]=='Q')
                    printf("%d
    ",find(yy)-find(xx-1));
                else if(s[0]=='A')
                    add(xx,yy);
                else if(s[0]=='S')
                    add(xx,-yy);
            }
            memset(c,0,sizeof(c));
            memset(a,0,sizeof(a));
        }
    }

    这里写图片描述

  • 相关阅读:
    WPF线程中获取控件的值和给控件赋值
    sublime text3 安装以及主要插件安装
    云服务IaaS,PaaS,SaaS
    What is JSON
    Core Java
    英语单词及语义
    设置PyCharm创建文件时自动添加头文件
    【练习】字典的循环遍历:实现多层级节点存取
    字符串格式化
    常用数据类型的方法--str、int、list、dict
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532474.html
Copyright © 2011-2022 走看看