单点更新是最最基础的线段树,只更新叶子节点,然后把信息用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. 基于链表的C语言堆内存检测

    说明 本文基于链表实现C语言堆内存的检测机制,可检测内存泄露.越界和重复释放等操作问题. 本文仅提供即视代码层面的检测机制,不考虑编译链接级的注入或钩子.此外,该机制暂未考虑并发保护. 相关性文章参见 ...

  2. Delphi中ClientDataSet的用法小结

    Delphi中ClientDataSet的用法小结 TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件.该控件封装了对数据进 ...

  3. 【Eclipse】启动时报错:No Java virtual machine (已解决)

    在 Ubuntu 上下了个最新的 Eclipse ,解压后运行报这样的错误: 当然 JDK 的安装及环境变量的配置是没有问题的.使用 java -version 查询本机的JDK版本是可以的. 如果不 ...

  4. C# 反射的深入了解

    Assembly.Load("")的使用说明如下;     并不是命名空间.常用的是程序集名称,也就是dll的名称 关于反射Assembly.Load("程序集" ...

  5. 使用gdb调试theos tweak插件

    查看设备日志tail -f /var/log/syslog或者 Mobilesubstrate injects your dylib into the target process. Debuggin ...

  6. sencha touch list css(样式) 详解

    /* *自定义列表页面 */ Ext.define('app.view.util.MyList', { alternateClassName: 'myList', extend: 'Ext.List' ...

  7. nginx expires配置

    配置expiresexpires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入   1 ...

  8. myisam与innodb索引比较

    MyISAM支持全文索引(FULLTEXT).压缩索引,InnoDB不支持 InnoDB支持事务,MyISAM不支持 MyISAM顺序储存数据,索引叶子节点保存对应数据行地址,辅助索引很主键索引相差无 ...

  9. Metrics.Net构建指标监控中心

    Metrics.NET(https://github.com/etishor/Metrics.NET)是一个给CLR 提供度量工具的包,它是移植自Java的metrics,支持的平台 .NET 4.5 ...

  10. apache反向代解决绝对路径可能出现的问题

    Apache2在对应用做反向代理的时候,如果应用的页面中引用的连接或者是资源的地址是相对地址的话,是没有问题的,当应用中引用的地址是绝对地址(比如:)或者是request.getContextPath ...