我是靠谱客的博主 天真冰淇淋,这篇文章主要介绍HDOJ 1166 敌兵布阵,现在分享给大家,希望可以做个参考。

        今天刚刚学了线段树,原来还有点不理解,毕竟数据结构中的树并没有经常涉及数组,虽然有讲,但已经忘得差不多了。这是我第一个线段树的题目,也是蒋雄学长讲课之后才接触,去了zzy学长的博客,感觉懂了它用数组构造树,和查询的整个过程

        所以对我来说,这道题很好入门的题。

复制代码
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
#include<iostream> using namespace std; #define MAXN 50005 int cnt[MAXN*4]; void Build(int l,int r,int pt)//pt是数组cnt的下标,从根节点开始 { if( l==r){ scanf("%d",&cnt[pt]); return ; } int mid=(l+r)>>1; Build(l,mid,pt<<1); // pt<<1 = 2*pt; Build(mid+1,r,pt<<1|1); //pt<<1|1 = 2*pt+1 ; cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1]; } void Update(int i,int add,int l,int r,int pt) { if( l==r){ cnt[pt]+=add; return ; } int mid=(l+r)>>1; if(i<=mid) Update(i,add,l,mid,pt<<1); else Update(i,add,mid+1,r,pt<<1|1); cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1]; } int Query(int L,int R,int l,int r,int pt) { if( L<=l&&R>=r) return cnt[pt]; int sum=0; int mid=(l+r)>>1; if(L<=mid) sum+=Query(L,R,l,mid,pt<<1); if(R>mid) sum+=Query(L,R,mid+1,r,pt<<1|1); return sum; } int main() { int i,t,n,c,l,r; char cmd[10]; scanf("%d",&t); for( c=1; c<=t; c++){ memset(cnt,0,sizeof(cnt)); scanf("%d",&n); Build(1,n,1); printf("Case %d:n",c); while( true){ scanf("%s",cmd); if( cmd[0]=='E') break; if( cmd[0]=='Q'){ scanf("%d%d",&l,&r); printf("%dn",Query(l,r,1,n,1)); } else if( cmd[0]=='A'){ scanf("%d%d",&i,&l); Update(i,l,1,n,1); } else{ scanf("%d%d",&i,&l); Update(i,-l,1,n,1); } } } return 0; }


最后

以上就是天真冰淇淋最近收集整理的关于HDOJ 1166 敌兵布阵的全部内容,更多相关HDOJ内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部