HDU 1166 - 敌兵布阵 - [单点修改、区间查询zkw线段树]
题还是那个题: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线段树]的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- 【线段树I:母题】hdu 1166 敌兵布阵
[线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵 (树状数组)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 1166敌兵布阵(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1166 敌兵布阵 (树状数组 单点修改+区间查询)
题目链接 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...
随机推荐
- [Arch] 04. Software Architectural Patterns
让我们一起 回忆: 原则 基本认识 S 应该仅有一个引起它变化的原因 O 在不被修改的前提下被扩展 L 尽量从抽象类继承 I 应该依赖于抽象 D 倾向瘦接口 让我们开始 新课: [Design Pat ...
- SpringMVC-----使用Maven创建Web项目
1.创建一个Maven的project 2.不使用骨架,去掉勾 3.这里的Packing 选择 war的形式 由于packing是war包,那么下面也就多出了webapp的目录 4.由于我们的项目要使 ...
- Linux wget 命令下载文件
wget是Linux系统中用来下载文件的工具,其功能还是比较多的,能够下载单个文件,也可以分段下载,下面小编将针对wget命令的用法给大家做个实例介绍. 实例1 :下载单个文件 # wget http ...
- 如何在LSI MegaRAID BIOS里设定RAID 10与Hot Spare
1. 同时按下 ”Ctrl + H” 进入MegaRAID WebBIOS 画面,可以看到所有物理硬盘 (Physical Drives) 的信息.请在左边视窗点选“Configuration Wiz ...
- NFS 简介
一.NFS 简介 1. NFS(Network File System)网络文件系统,它允许网络中的计算机之间通过 TCP/IP 网络共享资源2. NFS 应用场景:A,B,C 三台机器上需要保证被访 ...
- spine-unity3D 学习笔记
http://zh.esotericsoftware.com/spine-using-runtimes //skeletonData SkeletonAnimation skeletonAnimati ...
- mybatis 之 resultType="Map" parameterType="String"
<select id="getAllGoodsForSouJiaYi" resultType="Map" parameterType="Stri ...
- button按钮不能点击鼠标形状css 代码,禁用button按钮时鼠标形状
cursor:not-allowed;
- JDBC批量加密数据库密码
package com.lxc.wmb; import java.io.UnsupportedEncodingException; import java.security.MessageDigest ...
- mysql 创建merge表方便查询
SELECT COUNT(*) FROM `comment` SHOW CREATE TABLE `comment` CREATE TABLE `comment1` ( `id` ) NOT NULL ...