题目地址:

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. EXPDP IMPDP 知识总结

    Data Pump Export ATTACH Default: job currently in the user's schema, if there is only one Purpose(目的 ...

  2. Xcode7新特性

    更新Xcode7之后报错: Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], ...

  3. GetComponents和FindObjectsOfTypeAll区别

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_GetComponent.html GetComponents获得的是当 ...

  4. 利用后缀数组(suffix array)求最长公共子串(longest common substring)

    摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...

  5. TIMESTAMP和DATETIME的区别

    TIMESTAMP和DATETIME的区别 1. 存储空间不同 a) TIMESTAMP占用4个字节 b) DATETIME占用8个字节 2. 受时区影响 c) TIMESTAMP实际记录的是1970 ...

  6. md5实现

    /** * @param str * @return */ public static String stringToMD5(String str, String encode) { try { by ...

  7. js 联系电话验证实现

         var str=$('#tele').val();                                       var regPartton=/1[3-8]+\d{9}/;  ...

  8. python二进制文件解析

    struct.pack(): struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组).其函数原型 ...

  9. 2016-12-14jq笔记

    1.在jq中声明一个数组的方法有两种: 1.var a=new  Array(): 2 var b=[]; (效果一致) 2.bind()和live()的区别 3.animate的用法 4.place ...

  10. jquery-te 轻量级的编辑器