题目地址:

pid=1166">HDU 1166

听说胡浩版的线段树挺有名的。

于是就拜訪了一下他的博客。详情戳这里。于是就全然仿照着胡浩大牛的风格写的代码。

至于原理。鹏鹏学长已经讲的再清晰只是了。

我就在以下的代码凝视中将原理说明一下吧。来纪念第一发线段树。

以下是代码+凝视。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <stack>
using namespace std;
#define lson l, mid, rt<<1//直接定义子节点,由于每次都要用到,所以直接定义一个非常方便
#define rson mid+1, r, rt<<1 | 1
const int MAXN=51000;
int sum[MAXN<<2];
void PushUP(int rt)//向上更新父节点的值
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l, int r, int rt)//建立二叉树
{
if(l==r)//已经到达最底端的叶子节点,即单点,直接输入该值
{
scanf("%d",&sum[rt]);
return ;
}
int mid=(l+r)>>1;
build(lson);//向左子节点继续建立二叉树
build(rson);//向右子节点继续建立二叉树
PushUP(rt);//所有建立完后向上更新父节点的值
}
void update(int p, int x, int l, int r, int rt)//单点改动
{
if(l==r)//说明已经到了最底端的叶子节点,已经是单点了,能够直接改动该值
{
sum[rt]+=x;
return ;
}
int mid=(l+r)>>1;
if(p<=mid) update(p,x,lson);//假设要改动的值在这个区间左边,就进入左子节点继续寻找
else update(p,x,rson);//假设要改动的值在这个区间右边,就进入右子节点继续寻找
PushUP(rt);//改动完后。仍然要向上更新父节点的值
}
int query(int ll, int rr, int l, int r, int rt)//区间查询
{
if(ll<=l&&rr>=r)//假设要查询的区间全然覆盖了该子节点。直接返回该子节点的值
return sum[rt];
int mid=(l+r)>>1;
int ans=0;
if(ll<=mid) ans+=query(ll,rr,lson);//假设在该子节点左边另一部分要查询的区间。就去左子树继续查询
if(rr>mid) ans+=query(ll,rr,rson);//假设在该子节点右边另一部分要查询的区间,就去右子树继续查询
return ans;
}
int main()
{
int t, n, i, a, b, ans, num=0;
char s[20];
scanf("%d",&t);
while(t--)
{
num++;
printf("Case %d:\n",num);
memset(sum,0,sizeof(sum));
scanf("%d",&n);
build(1,n,1);//建立
/*for(i=1;i<=25;i++)
{
printf("%d %d\n",i,sum[i]);
}*/
getchar();
while(scanf("%s",s))
{
if(s[0]=='E') break;
if(!strcmp(s,"Add"))
{
scanf("%d%d",&a,&b);
update(a,b,1,n,1);//改动
}
else if(!strcmp(s,"Sub"))
{
scanf("%d%d",&a,&b);
update(a,-b,1,n,1); //改动
}
else
{
scanf("%d%d",&a,&b);
ans=query(a,b,1,n,1);//查询
printf("%d\n",ans);
}
}
}
return 0;
}

HDU 1166 敌兵布阵(线段树)的更多相关文章

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

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

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

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

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

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

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

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

  5. HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

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

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

  7. hdu 1166 敌兵布阵 (线段树、单点更新)

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

  8. hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题

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

  9. HDU 1166 敌兵布阵 线段树

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

  10. HDU 1166 - 敌兵布阵 - [线段树][树状数组]

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

随机推荐

  1. 删除重复记录的SQL语句

    1.所有字段均重复的记录(重复记录保留一条) Select distinct * into #Tmp from tblName Drop table tblName Select * into tbl ...

  2. 开始学习<p>标签,添加段落

    如果想在网页上显示文章,这时就需要<p>标签了,把文章的段落放到<p>标签中. 语法: <p>段落文本</p> 注意一段文字一个<p>标签, ...

  3. JavaScript--机选双色球

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)

    POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...

  5. Cloneable接口分析

    Cloneable接口是一个标记接口,也就是没有任何内容,定义如下: package java.lang; pubilc interface Cloneable { } 这里分析一下这个接口的用法 c ...

  6. id class

    id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式. HTML元素以id属性来设置id选择器,CSS 中 id 选择器以 "#" 来定义. 以下的样式规则应用于元素 ...

  7. bzoj2071: [POI2004]JAS

    Description 在Byteotia有一个洞穴. 它包含n 个洞室和一些隧道连接他们. 每个洞室之间只有一条唯一的路径连接他们. Hansel 在其中一个洞室藏了宝藏, 但是它不会说出它在哪. ...

  8. JS和正则表达式验证手机号码、邮箱等

    <-------------------------------------验证手机号码---------------------------------------------> fun ...

  9. 转:assert()函数用法总结

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h>void assert( in ...

  10. DC-DC转换器原理与应用

    DC/DC转换器为转变输入电压后,有效输出固定电压的电压转换器.DC/DC转换器分为三类:升压型DC/DC转换器.降压型DC/DC转换器以及升降压型DC/DC转换器.根据需求可采用三类控制.PWM控制 ...