hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)
单点更新是最最基础的线段树,只更新叶子节点,然后把信息用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(线段树入门)的更多相关文章
- HDU - 1166 敌兵布阵 方法一:(线段树+单点修改,区间查询和) 方法二:利用树状数组
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- 线段树 HDU-1166 敌兵布阵
敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...
- HDU-1166敌兵布阵(线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- hdu1166 敌兵布阵(线段树 求区间和 更新点)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU1166 敌兵布阵_线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 线段树 - HDU1166 - 敌兵布阵
2017-07-29 16:41:00 writer:pprp 线段树跟区间操作相关,想要在题目限定的时间内解决问题就需要用线段树这种数据结构来解决: 线段树是一种二叉平衡树 参考书目:张新华的< ...
- 线段树——hdu1166敌兵布阵
一.题目回顾 题目链接:敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个 ...
- hdu1166 敌兵布阵 线段树(区间更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU1166敌兵布阵(线段树单点更新)
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b ...
随机推荐
- c++ 友元类 与 友元类派生类
定义: 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明 ...
- 使用Struts时,JSP中如何取得各个会话中的参数值?
· request <s:property value="#request.req"/> 或者 ${requestScope.req} · session <s: ...
- EXPLAIN 具体含义 ( type possible_key key key_len ref )
- 题目1004:Median(qsort函数自定义cmp函数)
题目链接:http://ac.jobdu.com/problem.php?pid=1004 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- Linux系统更改网卡名称
自己装了一台机器,有两张网卡,一个是主板上自带的,还有一个是后来自己添加的.装完系统后,系统默认主板上的网卡为eth1,而自己添加的网卡是eth0,感觉不爽,所以想办法使用udev使系统将主板上的网卡 ...
- Artech的MVC4框架学习——第三章controller的激活
第一当目标controller的名称通过URL路由被解析出来后,asp.net mvc利用 ControllerBuilder 注册 ControllerFactory ,根据名称实现对目标contr ...
- 基于spring-cloud的微服务(2) eureka服务提供方的注册和消费方的消费
启动Eureka注册中心之后,服务提供方就可以注册到Eureka上去(作为一个Eureka的客户端) 我们使用IDEA提供的spring initializer来新建一个springcloud项目 填 ...
- kvm/qemu虚拟机桥接网络创建与配置
首先阐述一下kvm与qemu的关系,kvm是修改过的qemu,而且使用了硬件支持的仿真,仿真速度比QEMU快. 配置kvm/qemu的网络有两种方法.其一,默认方式为用户模式网络(Usermode N ...
- 【CF819D】Mister B and Astronomers EXGCD
[CF819D]Mister B and Astronomers 题意:小鼠Jack想当太空人(哦不,太空鼠)!为此,它在夜晚带领一堆小朋友一起来到户外看星星.一共有 $n$ 只小鼠,这些小鼠围成一 ...
- 解决 java.lang.IllegalThreadStateException: Thread already started. 错误
extends:http://blog.csdn.net/liuhanhan512/article/details/7575386 android开发中,对线程的操作比较悲催,start一个线程后,必 ...