线段树模板题,求区间和。
在figo的指导下学习了据说是非递归火星版线段树,写了一下,感觉还可以,觉得跟下午看的张昆玮版的微像啊,用杭电1166测试一下,1A,在此感谢一下figo的指导。
复制代码
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#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 50005; const int inf = 0; int seg[4*N],M; void segtree_build(int n){ int lv,i; for(M=1,lv=0;M<=n;M<<=1,lv++); seg[M]=inf; for(i=M+1;i<=M+n;i++) scanf("%d",&seg[i]); for(;i<(M<<1);i++) seg[i]=inf; for(--lv;lv>=0;lv--) for(i=(1<<lv);i<(1<<lv+1);i++) seg[i]=seg[i<<1]+seg[i<<1^1]; return ; } int segtree_query(int l,int r){ int ans=0; for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1){ if(!(l&1)) ans+=seg[l^1]; if(r&1) ans+=seg[r^1]; } return ans; } void segtree_insert(int p,int v){ for(p=p+M;p;p>>=1) seg[p]+=v; } int main(){ //freopen("in.in","r",stdin); int T,n,i,j,Case=1; char s[10]; scanf("%d",&T); while(T--){ scanf("%d",&n); printf("Case %d:n",Case++); segtree_build(n); while(scanf("%s",s),strcmp(s,"End")){ scanf("%d%d",&i,&j); if(!strcmp(s,"Query")) printf("%dn",segtree_query(i,j)); else if(!strcmp(s,"Add")) segtree_insert(i,j); else if(!strcmp(s,"Sub")) segtree_insert(i,-j); } } return 0; }
最后
以上就是奋斗黄豆最近收集整理的关于HDU/HDOJ----1166 敌兵布阵的全部内容,更多相关HDU/HDOJ----1166内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复