HDU 1166 敌兵布阵(线段树)
题目地址: 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 敌兵布阵(线段树)的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1166 敌兵布阵 (线段树、单点更新)
敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题
题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...
- HDU 1166 敌兵布阵 线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1166 - 敌兵布阵 - [线段树][树状数组]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- 017_bcp_bulk_openrowset
017_bcp_bulk_openrowset --bcp*********************************************************************** ...
- 转:常用的HTML标签和属性解释
基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---</TITLE>,包含 ...
- windows下安装CI框架
CI框架是一个非常流行的 mvc框架, CI框架如何安装和使用,在CI中文网已经讲的比较详细了 ,这里记录下几个需要注意的地方. 一. index.php问题 把压缩包下载解压到项目根目录即可运行里面 ...
- Mysql软删除
所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ...
- C++拾遗(三)关于复合类型
数组相关 初始化只能在定义的时候使用,不能把数组赋给另一个数组. 初始化可以提供比元素数目少的初值,其它元素将被置为0. 字符char数组只有在以\0结尾时才是一个字符串.sizeof()返回数组的长 ...
- CSS实现div居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- css阴影
文字阴影:text-shadow:[颜色 x轴 y轴 模糊半径],[颜色 x轴 y轴 模糊半径]... 区域阴影:box-shadow:[颜色 x轴 y轴 模糊半径],[颜色 x轴 y轴 模糊半径]. ...
- poj 2886Who Gets the Most Candies?
http://poj.org/problem?id=2886 #include <cstdio> #include <cstring> #include <algorit ...
- mysql通过SOURCE导入SQL时报错处理
ERROR: unknown command '\n' Can't connect to the server 网上查询了,多少是编码问题引起,一边是UTF8一边是GBK,反复调整MY.CNF配置文件 ...
- led驅動芯片對LED燈具的要求
1.LED驅動芯片直流額定輸入電壓范圍應當8 - 40 v,覆蓋廣泛的應用需求.最好的壓縮能力大于45 v.當輸入交流12 v.24 v,簡單的橋式整流器輸出電壓可以遵循電網電壓波動,特別是在高電壓輸 ...