题还是那个题: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. Eclipse------导入项目后出现javax.servlet.jsp cannot be resolved to a type

    报错信息:javax.servlet.jsp cannot be resolved to a type 原因1: 这个错误可能是服务器自带的servlet库未导入的原因. 解决方法: 右键项目&quo ...

  2. spring定时任务详解(@Scheduled注解)多线程讲解

    (一)在xml里加入task的命名空间 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...

  3. ios开发之--textview意见反馈页面(占位label,字数统计,提交按钮的交互设置)

    记录一个页面的功能: textview的占位符,字数统计,提交按钮的交互设置,具体效果图如下:

  4. scala中Map和Tuple

    /** * Created by root * Description : Tuple and Map */ object MapTest { def main(args: Array[String] ...

  5. 【权限维持】window几种隐藏技术

    “真正”隐藏文件 使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性.存档文件属性.只读文件属性和隐藏文件属性. attrib +s +a +h +r c:\test 这 ...

  6. Redis 集群配置

    Redis 集群介绍: (1) 为什么要使用集群:如果数据量很大,单台机器会存在存储空间不够用 .查询速度慢 .负载高等问题,部署集群就是为了解决这些问题(2) Redis 集群架构如下,采用无中心结 ...

  7. Android涉及到的网址都记录在这把~~~~

    http://source.android.com/source/initializing.html  开放源码 http://developer.android.com/about/versions ...

  8. 数字图像处理笔记与体会(一)——matlab编程基础

    最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...

  9. [Shell] Shell 中的算术

    Shell 脚本变量默认是作为字符串处理,而不是数字,这使得在 Shell 脚本做数学运算显得较为复杂.在保持脚本编程规范和更好的算术支持方便,Perl 和 Python 会是更好的选择.但是你仍然可 ...

  10. [C/E] 等差数列求和

    题目:要求给定一个整数 N,求从 0 到 N 之间所有整数相加之和. 解1:使用 for 循环依次递加. #include <stdio.h> int main(void){ int x; ...