zoukankan      html  css  js  c++  java
  • HDU1166 敌兵布阵(线段树模板)

    模板题:

    #include<iostream>
    #include<queue>
    #include<map>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    #include<stack>
    #include<string>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    const int inf=0x3f3f3f3f;
    struct node{
        int l,r;
        int cnt;
    }tr[N*4];
    int a[N];
    void pushup(int u){
        tr[u].cnt=tr[u<<1].cnt+tr[u<<1|1].cnt;
    }
    void build(int u,int l,int r){
        if(l==r){
            tr[u]=node{l,l,a[l]};
        }
        else{
            int mid=l+r>>1;
            tr[u]=node{l,r};
            build(u<<1,l,mid);
            build(u<<1|1,mid+1,r);
            pushup(u);
        }
    }
    void modify(int u,int x,int y){
        if(tr[u].l==tr[u].r){
            tr[u].cnt+=y;
            return ;
        }
        int mid=tr[u].l+tr[u].r>>1;
        if(x<=mid)
            modify(u<<1,x,y);
        else
            modify(u<<1|1,x,y);
        pushup(u);
    }
    int query(int u,int l,int r){
        if(tr[u].l>=l&&tr[u].r<=r){
            return tr[u].cnt;
        }
        int mid=tr[u].l+tr[u].r>>1;
        int res=0;
        if(l<=mid)
            res=query(u<<1,l,r);
        if(r>mid)
            res+=query(u<<1|1,l,r);
        return res;
    }
    int main(){
        int n,m;
        int t;
        cin>>t;
        int cnt=1;
        while(t--){
            cin>>n;
            int i;
            for(i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }
            build(1,1,n);
            string s;
            printf("Case %d:
    ",cnt++);
            while(cin>>s){
                if(s=="End")
                    break;
                if(s=="Add"){
                    int x;
                    int y;
                    scanf("%d%d",&x,&y);
                    modify(1,x,y);
                }
                else if(s=="Sub"){
                    int x;
                    int y;
                    scanf("%d%d",&x,&y);
                    modify(1,x,-y);
                }
                else{
                    int x,y;
                    scanf("%d%d",&x,&y);
                    printf("%d
    ",query(1,x,y));
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    mysql InnoDB 索引小记
    Linux shell 脚本小记
    Java中Integer的源码学习
    nginx小记
    位运算小结
    Redis小结
    CSS中nth-child和nth-of-type的简单使用
    Linux awk小记
    mysql小记--基础知识
    让44.1版本的sketch打开更高版本的sketch文件
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12507353.html
Copyright © 2011-2022 走看看