题还是那个题: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. [Arch] 04. Software Architectural Patterns

    让我们一起 回忆: 原则 基本认识 S 应该仅有一个引起它变化的原因 O 在不被修改的前提下被扩展 L 尽量从抽象类继承 I 应该依赖于抽象 D 倾向瘦接口 让我们开始 新课: [Design Pat ...

  2. SpringMVC-----使用Maven创建Web项目

    1.创建一个Maven的project 2.不使用骨架,去掉勾 3.这里的Packing 选择 war的形式 由于packing是war包,那么下面也就多出了webapp的目录 4.由于我们的项目要使 ...

  3. Linux wget 命令下载文件

    wget是Linux系统中用来下载文件的工具,其功能还是比较多的,能够下载单个文件,也可以分段下载,下面小编将针对wget命令的用法给大家做个实例介绍. 实例1 :下载单个文件 # wget http ...

  4. 如何在LSI MegaRAID BIOS里设定RAID 10与Hot Spare

    1. 同时按下 ”Ctrl + H” 进入MegaRAID WebBIOS 画面,可以看到所有物理硬盘 (Physical Drives) 的信息.请在左边视窗点选“Configuration Wiz ...

  5. NFS 简介

    一.NFS 简介 1. NFS(Network File System)网络文件系统,它允许网络中的计算机之间通过 TCP/IP 网络共享资源2. NFS 应用场景:A,B,C 三台机器上需要保证被访 ...

  6. spine-unity3D 学习笔记

    http://zh.esotericsoftware.com/spine-using-runtimes //skeletonData SkeletonAnimation skeletonAnimati ...

  7. mybatis 之 resultType="Map" parameterType="String"

    <select id="getAllGoodsForSouJiaYi" resultType="Map" parameterType="Stri ...

  8. button按钮不能点击鼠标形状css 代码,禁用button按钮时鼠标形状

    cursor:not-allowed;

  9. JDBC批量加密数据库密码

    package com.lxc.wmb; import java.io.UnsupportedEncodingException; import java.security.MessageDigest ...

  10. mysql 创建merge表方便查询

    SELECT COUNT(*) FROM `comment` SHOW CREATE TABLE `comment` CREATE TABLE `comment1` ( `id` ) NOT NULL ...