hdoj 1166 敌兵布阵

来源:互联网 发布:淘宝改一口价的技巧 编辑:程序博客网 时间:2024/06/06 01:43

题目链接:敌兵布阵


题目大意:给你n个数,有这样的一些操作,将某个位置的数增加一个value,将某个位置的数减少一个value,查找某个区间x到y的区间和


题目思路:首先,直接暴力是不可行的,N的数据范围为50000,然后是单点更新加区间求和,树状数组可做,然后直接套班子就好

#include <bits/stdc++.h>using namespace std;const int maxn = 5e4+10;int N,c[maxn],a[maxn];int lowbit(int i){    return i&(-i);}void add(int i,int value){    while(i <= N){        c[i]+=value;        i += lowbit(i);    }}int sum(int i){    int sum = 0;    while(i > 0){        sum += c[i];        i -= lowbit(i);    }    return sum;}int main(){    int t,x,y,Case = 1;    char op[20];    scanf("%d",&t);    while(t--){        scanf("%d",&N);        memset(c,0,sizeof(c));        for(int i = 1;i <= N;i++){            scanf("%d",&x);add(i,x);        }        printf("Case %d:\n",Case);Case++;        while(scanf("%s",op)){            if(op[0] == 'E') break;            else if(op[0] == 'A'){                scanf("%d%d",&x,&y);                add(x,y);            }            else if(op[0] == 'S'){                scanf("%d%d",&x,&y);                add(x,-y);            }            else if(op[0] == 'Q'){                scanf("%d%d",&x,&y);                printf("%d\n",sum(y)-sum(x-1));            }        }    }    return 0;}

原创粉丝点击