hdu1166

来源:互联网 发布:知乎led灯化妆镜 编辑:程序博客网 时间:2024/06/11 14:33

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

解题思路:用线段树维护每一个区间。

#include <cstdio>#include <memory.h>const int maxn = 55555;int sum[maxn<<1];void PushUP(int rt) {       sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(int l,int r,int rt) {       if (l == r) {              scanf("%d",&sum[rt]);              return ;       }       int m = (l + r) >> 1;       build(l,m,rt<<1);       build(m+1,r,rt<<1|1);       PushUP(rt);}void update(int p,int add,int l,int r,int rt) {       if (l == r) {              sum[rt] += add;              return ;       }       int m = (l + r) >> 1;       if (p <= m) update(p , add , l,m,rt<<1);       else update(p , add , m+1,r,rt<<1|1);       PushUP(rt);}int query(int L,int R,int l,int r,int rt) {       if (L <= l && r <= R) {              return sum[rt];       }       int m = (l + r) >> 1;       int ret = 0;       if (L <= m) ret += query(L , R , l,m,rt<<1);       if (R > m) ret += query(L , R , m+1,r,rt<<1|1);       return ret;}int main() {       int T , n;       scanf("%d",&T);       memset(sum,0,sizeof(sum));       for (int cas = 1 ; cas <= T ; cas ++) {              printf("Case %d:\n",cas);              scanf("%d",&n);              build(1 , n , 1);              char op[10];              while (scanf("%s",op)) {                     if (op[0] == 'E') break;                     int a , b;                     scanf("%d%d",&a,&b);                     if (op[0] == 'Q')                        printf("%d\n",query(a , b , 1 , n , 1));                     else if (op[0] == 'S')                        update(a , -b , 1 , n , 1);                     else                        update(a , b , 1 , n , 1);              }       }       return 0;}


0 0
原创粉丝点击