hdu 1166 敌兵布阵

来源:互联网 发布:不用网络调频收音机 编辑:程序博客网 时间:2024/06/11 11:06

题目链接:

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

解题思路:

(1)Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束。

可以用树状数组做,也可以用线段树做。。。

AC代码(树状数组):

    #include <iostream>    #include <cstdio>    #include <cstring>    using namespace std;    int n;    int c[50005];    int lowbit(int x){        return x&(-x);    }    void add(int x,int val){        while(x <= n){            c[x] += val;            x += lowbit(x);        }    }    int sum(int x){        int ans = 0;        while(x){            ans += c[x];            x -= lowbit(x);        }        return ans;    }    int main(){        int T,t = 1;        scanf("%d",&T);        while(T--){            memset(c,0,sizeof(c));            int val;            scanf("%d",&n);            for(int i = 1; i <= n; i++){                scanf("%d",&val);                add(i,val);            }            char op[10];            int a,b;            printf("Case %d:\n",t++);            while(1){                scanf("%s",op);                if(op[0] == 'Q'){                    scanf("%d%d",&a,&b);                    printf("%d\n",sum(b)-sum(a-1));                }                else if(op[0] == 'A'){                    scanf("%d%d",&a,&b);                    add(a,b);                }                else if(op[0] == 'S'){                    scanf("%d%d",&a,&b);                    add(a,-b);                }                else                    break;            }        }        return 0;    }


AC代码(线段树):

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N  = 50005;int n;int a[N];struct node{    int l,r,sum;}tree[N<<2];void build(int m,int l,int r){    tree[m].l = l;    tree[m].r = r;    if(l == r){        tree[m].sum = a[l];        return;    }    int mid = (l+r)>>1;    build(m<<1,l,mid);    build(m<<1|1,mid+1,r);    tree[m].sum = tree[m<<1].sum+tree[m<<1|1].sum;}void update(int m,int a,int val){    if(tree[m].l == a && tree[m].r == a){        tree[m].sum += val;        return;    }    int mid = (tree[m].l+tree[m].r)>>1;    if(a <= mid)        update(m<<1,a,val);    else        update(m<<1|1,a,val);    tree[m].sum = tree[m<<1].sum+tree[m<<1|1].sum;}int query(int m,int l,int r){    if(tree[m].l == l && tree[m].r == r)        return tree[m].sum;    int mid = (tree[m].l+tree[m].r)>>1;    if(r <= mid)        return query(m<<1,l,r);    else if(l > mid)        return query(m<<1|1,l,r);    return query(m<<1,l,mid)+query(m<<1|1,mid+1,r);}int main(){    int T,t = 1;    scanf("%d",&T);    while(T--){        int val;        scanf("%d",&n);        for(int i = 1; i <= n; i++)            scanf("%d",&a[i]);        build(1,1,n);        char op[10];        int a,b;        printf("Case %d:\n",t++);        while(1){            scanf("%s",op);            if(op[0] == 'Q'){                scanf("%d%d",&a,&b);                printf("%d\n",query(1,a,b));            }            else if(op[0] == 'A'){                scanf("%d%d",&a,&b);                update(1,a,b);            }            else if(op[0] == 'S'){                scanf("%d%d",&a,&b);                update(1,a,-b);            }            else                break;        }    }    return 0;}


0 0
原创粉丝点击