我是靠谱客的博主 奋斗黄豆,最近开发中收集的这篇文章主要介绍HDU/HDOJ----1166 敌兵布阵,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线段树模板题,求区间和。

在figo的指导下学习了据说是非递归火星版线段树,写了一下,感觉还可以,觉得跟下午看的张昆玮版的微像啊,用杭电1166测试一下,1A,在此感谢一下figo的指导。

#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 敌兵布阵所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部