hdu 1166

Posted LMissher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1166相关的知识,希望对你有一定的参考价值。

题目:线段树模板题。

 

代码:

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
struct
node{
    int
right,left;
    int
sum;
}
tree[210000];
int
a[51000];
void
build(int root,int start,int end){
    tree[root].left=start;
    tree[root].right=end;
    if
(start==end){
        tree[root].sum=a[start];
        return
;
    }

    int
m=(tree[root].left+tree[root].right)/2;
    build(root*2,start,m);
    build(root*2+1,m+1,end);
    tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}

void
update_sub(int root,int pos,int val){
    if
(tree[root].left==tree[root].right&&tree[root].left==pos){
        tree[root].sum-=val;
        return
;
    }

    int
m=(tree[root].left+tree[root].right)/2;
    if
(pos<=m)    update_sub(root*2,pos,val);
    else
update_sub(root*2+1,pos,val);
    tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}

void
update_add(int root,int pos,int val){
    if
(tree[root].left==tree[root].right&&tree[root].left==pos){
        tree[root].sum+=val;
        return
;
    }

    int
m=(tree[root].left+tree[root].right)/2;
    if
(pos<=m)    update_add(root*2,pos,val);
    else
update_add(root*2+1,pos,val);
    tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}

int
question(int root,int start,int end){
    if
(tree[root].left==start&&tree[root].right==end)    return tree[root].sum;
    int
m=(tree[root].left+tree[root].right)/2;
    if
(end<=m)    return question(root*2,start,end);
    else if
(start>=m+1)    return question(root*2+1,start,end);
    else return
question(root*2,start,m)+question(root*2+1,m+1,end);
}

int
main(){
    int
t,tot=1;
    scanf("%d",&t);
    while
(t--){
        int
n;
        scanf("%d",&n);
        for
(int i=1;i<=n;i++)    scanf("%d",&a[i]);
        build(1,1,n);
        printf("Case %d:\n",tot);
        string s;
        while
(cin>>s){
            if
(s=="End")    break;
            int
i,j;
            scanf("%d%d",&i,&j);
            if
(s=="Query")    printf("%d\n",question(1,i,j));
            else if
(s=="Sub")    update_sub(1,i,j);
            else
update_add(1,i,j);
        }

        tot++;
    }

    return
0;
}

以上是关于hdu 1166的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1166 敌兵布阵

HDU 1166 敌兵布阵

hdu 1166 敌兵布阵

HDU_1166_树状数组

树状数组(hdu-4325,hdu-1166,pat-1057)

[HDU 1166] 敌兵布阵