单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来。

http://acm.hdu.edu.cn/showproblem.php?pid=1166

update单点更新,query区域求和。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 200001
using namespace std;
struct node
{
int l,r;
__int64 w;
} q[*N];
void pushup(int rt)
{
q[rt].w=q[rt*].w+q[rt*+].w;
}
void build(int l,int r,int rt)
{
q[rt].l=l;
q[rt].r=r;
q[rt].w=;
if(l==r)
{
scanf("%I64d",&q[rt].w);
return ;
}
build(l,(l+r)/,rt*);
build((l+r)/+,r,rt*+);
pushup(rt);
}
void update(int sum,int key,int l,int r,int rt)
{
if(sum<l||sum>r)
return ;
if(l==r&&sum==l)
{
q[rt].w+=(__int64)key;
return ;
}
update(sum,key,l,(l+r)/,rt*);
update(sum,key,(l+r)/+,r,rt*+);
pushup(rt);
}
__int64 query(int ll,int rr,int l,int r,int rt)
{
if(ll>r||rr<l) return ;
if(ll<=l&&rr>=r)
{
return q[rt].w;
}
return query(ll,rr,l,(l+r)/,rt*)+query(ll,rr,(l+r)/+,r,rt*+);
}
int main()
{
int n,sum1,sum2,T,K=;
char a[];
scanf("%d",&T);
while(T--)
{
K++;
scanf("%d",&n);
build(,n,);
printf("Case %d:\n",K);
while(scanf("%s",a)!=EOF)
{
if(strcmp(a,"End")==) break;
else if(strcmp(a,"Query")==)
{
scanf("%d%d",&sum1,&sum2);
__int64 t=query(sum1,sum2,,n,);
printf("%I64d\n",t);
}
else if(strcmp(a,"Sub")==)
{
scanf("%d%d",&sum1,&sum2);
update(sum1,-sum2,,n,); }
else if(strcmp(a,"Add")==)
{
scanf("%d%d",&sum1,&sum2);
update(sum1,sum2,,n,);
}
} }
return ;
}

http://acm.hdu.edu.cn/showproblem.php?pid=1754

update单点替换,query区间最值

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 200001
using namespace std;
struct node
{
int l,r;
__int64 w;
}q[*N];
void pushup(int rt)
{
q[rt].w=max(q[rt*].w,q[rt*+].w);
}
void build(int l,int r,int rt)
{
q[rt].l=l;
q[rt].r=r;
q[rt].w=;
if(l==r)
{
scanf("%I64d",&q[rt].w);
return ;
}
build(l,(l+r)/,rt*);
build((l+r)/+,r,rt*+);
pushup(rt);
}
void update(int sum,int key,int l,int r,int rt)
{
if(sum<l||sum>r)
return ;
if(l==r&&sum==l)
{
q[rt].w=(__int64)key;
return ;
}
update(sum,key,l,(l+r)/,rt*);
update(sum,key,(l+r)/+,r,rt*+);
pushup(rt);
}
__int64 query(int ll,int rr,int l,int r,int rt)
{
if(ll>r||rr<l) return ;
if(ll<=l&&rr>=r)
{
return q[rt].w;
}
return max(query(ll,rr,l,(l+r)/,rt*),query(ll,rr,(l+r)/+,r,rt*+));
}
int main()
{
int n,m,sum1,sum2;
char a[];
while(scanf("%d%d",&n,&m)!=EOF)
{
build(,n,);
while(m--)
{
scanf("%s%d%d",a,&sum1,&sum2);
if(a[]=='U')
{
update(sum1,sum2,,n,);
}
else if(a[]=='Q')
{
__int64 t=query(sum1,sum2,,n,);
printf("%I64d\n",t);
}
}
}
return ;
}

hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)的更多相关文章

  1. HDU - 1166 敌兵布阵 方法一:(线段树+单点修改,区间查询和) 方法二:利用树状数组

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

  2. 线段树 HDU-1166 敌兵布阵

    敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...

  3. HDU-1166敌兵布阵(线段树)

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

  4. hdu1166 敌兵布阵(线段树 求区间和 更新点)

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

  5. HDU1166 敌兵布阵_线段树

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

  6. 线段树 - HDU1166 - 敌兵布阵

    2017-07-29 16:41:00 writer:pprp 线段树跟区间操作相关,想要在题目限定的时间内解决问题就需要用线段树这种数据结构来解决: 线段树是一种二叉平衡树 参考书目:张新华的< ...

  7. 线段树——hdu1166敌兵布阵

    一.题目回顾 题目链接:敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个 ...

  8. hdu1166 敌兵布阵 线段树(区间更新)

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

  9. HDU1166敌兵布阵(线段树单点更新)

    线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.       对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b ...

随机推荐

  1. 【转载】Yui.Compressor高性能ASP.NET开发:自动压缩CSS、JS

    在开发中编写的js.css发布的时候,往往需要进行压缩,以减少文件大小,减轻服务器的负担.这就得每次发版本的时候,对js.js进行压缩,然后再发布.有没有什么办法,让代码到了服务器上边,它自己进行压缩 ...

  2. 13条Android手机必备技巧 让玩机更有趣

    腾讯数码讯(编译:张秀梅)如果你不是一名极客或手机爱好者,那么或许对于手中的Android手机来说,肯定无法做到百分之百了解.对于这款世界上最受欢迎的操作系统来说,有许多不为大部分人所知晓的使用技巧或 ...

  3. Linux线程编程之生产者消费者问题

    前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 ...

  4. 基于VLAN的二三层转发

    [章节内容]1 MAC地址2 冲突域和广播域3 集线器.交换机.路由器   3.1 集线器   3.2 网桥和交换机   3.3 路由器4 VLAN   4.1 VLAN帧格式      4.1.1 ...

  5. Python在mysql中进行操作是十分容易和简洁的

    首先声明一下,我用的是Windows系统! 1.在Python中对mysql数据库进行操作首先要导入pymysql模块,默认情况下,Python中是没有安装这个模块的, 可以在Windows的命令行中 ...

  6. Android程序对不同手机屏幕分辨率自适应的方法

    相信各位Android开发爱好者都知道,由于OEM之间的竞争,各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知.目前比较主流的有WVGA=800x480,HVGA=480x3 ...

  7. sencha touch Container

    Container控件是我们在实际开发中最常用的控件,大部分视图控件都是继承于Container控件,了解此控件能帮我们更好的了解sencha touch. layout是一个很重要的属性,能够帮助你 ...

  8. HTTP协议详解(真的很经典)(转载)

    HTTP协议详解(真的很经典):http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 引言 HTTP是一个属于应用层的面向对象的协 ...

  9. C语言位操作--不用中间变量交换两数值

    1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...

  10. Egret的屏幕适配模式图示

    1 ShowAll 过长时,上边有边框 过短时,左右有边框 2 noScale 不会进行任何缩放 3 noBorder 过长时,裁减左右 过短时,裁减上下 4 fixedWidth 过长时,下方有边框 ...