我是靠谱客的博主 多情高山,这篇文章主要介绍hdu 1166 敌兵布阵,现在分享给大家,希望可以做个参考。

开始学习线段树,先做一道简单题,增加信心。

  此题要求对一列数进行某一项的增减操作和区间求和,那显然是线段树。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <map> #include <queue> #include <deque> using namespace std; const int maxn = 100000 + 5; const int INF = 0x7fffffff; int n, dat[2 * maxn - 1]; int T; char order[6]; void init(int n_) { n = 1; while (n < n_) n *= 2; for (int i = 0; i < 2 * n - 1; i++) dat[i] = 0; } void update(int k, int a, int sig) { k += n - 1; dat[k] += a * sig; while (k > 0) { k = (k - 1) / 2; dat[k] = dat[2 * k + 1] + dat[2 * k + 2]; } } int query(int a, int b, int k, int l, int r) { if (a >= r || b <= l) return 0; if (a <= l && r <= b) return dat[k]; int mid = (r - l) / 2; int vl = query(a, b, 2 * k + 1, l, l + mid); int vr = query(a, b, 2 * k + 2, l + mid, r); return vl + vr; } int main() { int n_, x, m; scanf("%d", &T); for (int t = 1; t <= T; t++) { printf("Case %d:n", t); scanf("%d", &n_); init(n_); m = n - 1; for (int i = 0; i < n_; i++) { scanf("%d", &x); update(i, x, 1); } int a, b; while (~scanf("%s", order)) { int tag = 1; char c = order[0]; if (c == 'E') break; scanf("%d%d", &a, &b); if (c == 'Q') { printf("%dn", query(a - 1, b, 0, 0, n)); } else { if (c == 'S') tag = -1; update(a - 1, b, tag); } } } return 0; }

敲完后一发AC,无坑点。


最后

以上就是多情高山最近收集整理的关于hdu 1166 敌兵布阵的全部内容,更多相关hdu内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部