码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 1116 敌兵布阵(树状数组区间求最值)

时间:2015-11-27 23:21:21      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

题意:

给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j)。

 

输入:

首行输入一个t,表示共有t组数据。

接下来每行首行输入一个整数n,表示共有n个数字。

接下来每行首先输入一个字符串,如果是”Add”,接下来是两个整数ab,表示给第i个数增加b。如果是”Query”,接下来是两个整数ab,表示查询从第i个数到第j个数之间的和。如果是”End”,表示这组数据结束。

 

输出:

每组数据首先输出”Case X: ”,其中X表示第x组数。

每次查询,输出计算结果,每个结果占一行。

 

题解:

点修改与区间求和,可以用树状数组模板。

 

具体见代码——

技术分享
 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N = 50005;
 8 
 9 int t, n;
10 int a[N];
11 int c[N];
12 char s[10];
13 int x, y;
14 
15 int lowbit(int x)
16 {
17     return x&(-x);
18 }
19 
20 void Add(int x, int y)
21 {
22     a[x] += y;
23     while(x <= n)
24     {
25         c[x] += y;
26         x += lowbit(x);
27     }
28 }
29 
30 int Sum(int x)
31 {
32     int rt = 0;
33     while(x > 0)
34     {
35         rt += c[x];
36         x -= lowbit(x);
37     }
38     return rt;
39 }
40 
41 int Summ(int l, int r)
42 {
43     int rt = 0;
44     while(r >= l)
45     {
46         if(r-lowbit(r) < l)
47         {
48             rt += a[r];
49             r -= 1;
50         }
51         else
52         {
53             rt += c[r];
54             r -= lowbit(r);
55         }
56     }
57     return rt;
58 }
59 
60 void Query(int a, int b)
61 {
62     printf("%d\n", Sum(b)-Sum(a-1));
63     //printf("%d\n", Summ(a, b));
64 }
65 
66 int main()
67 {
68     //freopen("test.in", "r", stdin);
69     scanf("%d", &t);
70     for(int tm = 1; tm <= t; tm++)
71     {
72         scanf("%d", &n);
73         memset(c, 0, sizeof(c));
74         memset(a, 0, sizeof(a));
75         int y;
76         for(int i = 1; i <= n; i++)
77         {
78             scanf("%d", &y);
79             Add(i, y);
80         }
81         printf("Case %d:\n", tm);
82 
83         scanf("%s", s);
84         while(s[0] != E)
85         {
86             scanf("%d%d", &x, &y);
87             if(s[0] == A) Add(x, y);
88             if(s[0] == Q) Query(x, y);
89             if(s[0] == S) Add(x, -y);
90             scanf("%s", s);
91         }
92     }
93 }
View Code

树状数组区间求和模板——

http://www.cnblogs.com/mypride/p/5001858.html

hdu 1116 敌兵布阵(树状数组区间求最值)

标签:

原文地址:http://www.cnblogs.com/mypride/p/5001864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!