题还是那个题:http://www.cnblogs.com/dilthey/p/6827959.html

不过我们今天换一种线段树实现来做这道题;

关于zkw线段树的讲解:https://zhuanlan.zhihu.com/p/29876526(而且我还在文章里被@了,超开心的ヾ(≧∇≦*)ヾ)

可以说是讲解非常的清楚了!

AC代码(包含了拥有节点更新、区间查询功能的zkw线段树模板):

 #include<cstdio>
#include<cstring>
#define MAX 131072
int n,m;
int tree[MAX];
void pushup(int rt){tree[rt]=tree[rt<<]+tree[rt<<|];}
void build()
{
for(m=;m<n;m<<=);
for(int i=m;i<=*m-;i++) tree[i]=;//初始化叶子结点
for(int i=m+;i<=m+n;i++) scanf("%d",&tree[i]);//存储单点值到叶子结点
for(int i=m-;i;i--) pushup(i);
}
void update(int pos,int val)
{
pos+=m;
tree[pos]+=val;//更新叶子结点
for(pos>>=;pos;pos>>=) pushup(pos);
}
int query(int l,int r)
{
int ret=;
for(l=l+m-,r=r+m+;l^r^;l>>=,r>>=)
{
if(~l&) ret+=tree[l^];
if(r&) ret+=tree[r^];
}
return ret;
}
int main()
{
int t;
scanf("%d",&t);
for(int kase=;kase<=t;kase++)
{
scanf("%d",&n);
build();
printf("Case %d:\n",kase);
char input[];
while()
{
scanf("%s",input);
if(input[]=='E') break;
if(input[]=='Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
if(input[]=='A')
{
int pos,x;
scanf("%d%d",&pos,&x);
update(pos,x);
}
if(input[]=='S')
{
int pos,x;
scanf("%d%d",&pos,&x);
update(pos,-x);
}
}
}
}

PS. MAX=131072这个也是比较有讲究的,因为n最大是50000,所以对应的我们的m算出来是65536,所以这棵完全二叉树最后一个叶子节点的编号为2 * 65536 - 1 = 131072 - 1.

PS2.其实不难发现,zkw线段树也是一种用空间换取时间和代码量的做法.

HDU 1166 - 敌兵布阵 - [单点修改、区间查询zkw线段树]的更多相关文章

  1. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  2. HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)

    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...

  3. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  4. 【线段树I:母题】hdu 1166 敌兵布阵

    [线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...

  5. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

  6. HDU 1166 敌兵布阵 (树状数组)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    ...

  7. hdu 1166敌兵布阵(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    M ...

  8. HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU 1166 敌兵布阵 (树状数组 单点修改+区间查询)

    题目链接 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

随机推荐

  1. AES五种加密模式

    分组密码在加密时明文分组的长度是固定的,而实用中待加密消息的数据量是不定的,数据格式可能是多种多样的.为了能在各种应用场合安全地使用分组密码,通常对不同的使用目的运用不同的工作模式. 一.电码本模式( ...

  2. MAC下Android的Eclipse开发环境的搭建 转自MacroCheng

    原文地址:  http://www.cnblogs.com/macro-cheng/archive/2011/09/30/android-001.html 一.Eclipse的下载 到网站:http: ...

  3. Java从控制台接受输入字符

    创建一个类,在该类的主方法中创建Scanner扫描起来封装System类的in输入流,然后提示用户输入身份证号码,并输入身份证号码的位数. 代码如下: import java.util.Scanner ...

  4. mongodb 初学 目录

    mongodb 初学 索引 啦啦啦 MongoDB 教程 NoSQL 简介 MongoDB 简介 Windows 平台安装 MongoDB Linux平台安装MongoDB mongodb 在 Ubu ...

  5. SpringBoot application.properties (application.yml)优先级从高到低

    SpringBoot application.properties(application.yml) 优先级从高到低 SpringBoot配置文件优先级从高到低 =================== ...

  6. 【GIS】Cesium1.49编译

    1.npm install 2.npm install --save-dev gulp 3.gulp default 4.npm run build 5.npm start 遇到问题 1.gulp不好 ...

  7. linux下kill -9 pid 强制不能杀掉进程原因

    今天安装集群的时候,发现一个进程一直存在,kill -9 pid  也干不掉,就找找原因了. kill -9发送SIGKILL信号将其终止,但是以下两种情况不起作用:a.该进程处于"Zomb ...

  8. iOS开发-NSDictionary

    判断一个字典中是否存在某个key,有两种方法: 方法一: if ([dictionary allKeys] containsObject: key]){ // cotains key operatio ...

  9. Nginx 访问日志

    配置访问日志: [root@localhost ~]$ cat /usr/local/nginx/conf/nginx.conf http { log_format main '$remote_add ...

  10. mybatis 之resultType="Map"

    Map map = new HashMap(); map.put("productTypeID", productTypeId); List<HashMap> prod ...