题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
题面就不在这里发了,大家自行去hdoj看题。
第一次做线段树题,套板子很不熟悉。最后还是看了某大牛的代码才写出来。
上代码:
复制代码
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using namespace std; int a[50010]; char str[10]; int x,y; int n; struct Node { int l, r; int Max; int sum; } segTree[50010*4]; void build(int i, int l, int r) { segTree[i].l = l; segTree[i].r = r; segTree[i].Max = 0; if (l == r) { segTree[i].sum=a[l]; return ; } int mid = (l + r) / 2; build(i << 1, l, mid); build((i << 1) | 1, mid + 1, r); segTree[i].sum=segTree[i<<1].sum+segTree[(i<<1)+1].sum; return ; } void push_up(int i) { segTree[i].Max = max(segTree[i << 1].Max, segTree[(i << 1)|1].Max); segTree[i].sum=segTree[i<<1].sum+segTree[(i<<1)+1].sum; } void update(int i, int k, int val) { if (segTree[i].l == k && segTree[i].r == k) { segTree[i].sum += val; segTree[i].Max += val; return ; } int mid = (segTree[i].l + segTree[i].r) / 2; if (k <= mid) { update(i << 1, k, val); } else { update((i << 1) | 1, k, val); } push_up(i); return ; } int query(int i, int l, int r) { if (segTree[i].l == l && segTree[i].r == r) { return segTree[i].sum; } int mid = (segTree[i].l + segTree[i].r) / 2; if (r <= mid) { return query(i << 1, l, r); } else if (l > mid) { return query((i << 1) | 1, l, r); } else { return query(i << 1, l, mid)+query((i << 1) | 1, mid + 1, r); } } int main() { int k=0; int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); printf("Case %d:n", ++k); build(1,1,n); while (scanf("%s", str)) { if (str[0] == 'E') break; if (str[0] == 'A') { scanf("%d %d", &x, &y); update(1, x, y); } if (str[0] == 'S') { scanf("%d %d", &x, &y); update(1, x, -y); } if (str[0] == 'Q') { scanf("%d %d", &x, &y); printf("%dn", query(1, x, y)); } } } return 0; }
最后
以上就是悲凉野狼最近收集整理的关于hdu1166(敌兵布阵)(线段树经典题)的全部内容,更多相关hdu1166(敌兵布阵)(线段树经典题)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复