题解:

和hdu1166敌兵布阵不同的是 这道题需要区间更新(成段更新)。

单点更新不用说了比较简单,区间更新的话,如果每次都更新到底的话,有点费时间。

这里就体现了线段树的另一个重要思想:延迟标记。

在定义树节点结构体的时候加一个标记:flag。

typedef struct node
{
node():l(0),r(0),data(0),flag(0){} //构造函数 初始化数据成员
int l,r;
int data; //每个节点的数据
int flag; //延迟标记
}TNode;

更新的时候 如果当前区间 被 要更新的区间包括,则标志一下操作 flag,更新一下当前数据 ,直接返回,不必更新到叶子节点。

然后再次 更新或查询的时候 如果该节点有标记,则把当前节点的数据更新,把标志传到孩子节点,再把标志清0。

这就是lazy(延迟、懒惰)思想。

它的好处是更新的时候可以节省大量时间。

知道了lazy思想,那么怎么实现呢?看代码:

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int MAX=100001; typedef struct node
{
node():l(0),r(0),data(0),flag(0){} //构造函数 初始化数据成员
int l,r;
int data; //每个节点的数据
int flag; //延迟标记
}TNode; TNode tNode[MAX<<4]; void pushup(int p) //向上更新
{
tNode[p].data=tNode[p<<1].data+tNode[p<<1|1].data;
} void pushdown(int p) //向下更新
{
tNode[p<<1].flag=tNode[p<<1|1].flag=tNode[p].flag; //把当前节点的标志传到孩子节点
tNode[p<<1].data=(tNode[p<<1].r-tNode[p<<1].l+1)*tNode[p].flag; //更新孩子节点的data数据
tNode[p<<1|1].data=(tNode[p<<1|1].r-tNode[p<<1|1].l+1)*tNode[p].flag;
tNode[p].flag=0; //标志清0
} void buildTree(int p,int l,int r)
{
tNode[p].l=l;
tNode[p].r=r;
tNode[p].flag=0; //建树的时候flag要为0,表示没有操作
if(l==r)
{
tNode[p].data=1;
return;
}
int mid=(l+r)>>1;
buildTree(p<<1,l,mid);
buildTree(p<<1|1,mid+1,r);
pushup(p);
return;
} void update(int p,int l,int r,int x)
{
if(tNode[p].l>=l&&tNode[p].r<=r) //找到 被要更新的区间[l,r]包括的 节点
{
tNode[p].flag=x; //标志一下操作,意思就是把当前以及孩子节点的data值赋值为x。
tNode[p].data=(tNode[p].r-tNode[p].l+1)*x; //更新当前节点的data值。当前区间[l,r]。则它的和为(r-l+1)*x。没毛病!!
return;
}
if(tNode[p].l>r||tNode[p].r<l) //如果当前区间和要更新的区间没有交集
{
return;
}
if(tNode[p].flag!=0) pushdown(p); //如果当前区间有操作标记,则向下更新并把标记传给左右孩子节点
update(p<<1,l,r,x); //更新左孩子
update(p<<1|1,l,r,x); //更新右孩子
pushup(p); //回溯的时候向上更新 } //这个方法这道题没用到
int query(int p,int l,int r)
{
if(tNode[p].l>=l&&tNode[p].r<=r)
{
return tNode[p].data;
}
if(tNode[p].l>r||tNode[p].r<l)
{
return 0;
}
int sum=0;
sum+=query(p<<1,l,r);
sum+=query(p<<1|1,l,r);
return sum;
} int main()
{
int Case;
scanf("%d",&Case);
for(int t=1;t<=Case;t++)
{
int n,op;
scanf("%d%d",&n,&op);
buildTree(1,1,n);
while(op--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(1,a,b,c);
}
printf("Case %d: The total value of the hook is %d.\n",t,tNode[1].data);
}
return 0;
}

  

hdu1698 Just a hook 线段树区间更新的更多相关文章

  1. 【原创】hdu1698 Just a Hook(线段树→区间更新,区间查询)

    学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新. 区间更新就是lazy思想,我来按照自己浅薄的理解谈谈lazy思想: 就是在数据结构中,树形结构可以线性存储(线性表 ...

  2. hdu1698 Just a Hook (线段树区间更新 懒惰标记)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. hdu-------(1698)Just a Hook(线段树区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. (简单) HDU 1698 Just a Hook , 线段树+区间更新。

    Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...

  5. HDU 1698 Just a Hook(线段树区间更新查询)

    描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...

  6. Just a Hook 线段树 区间更新

    Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...

  7. HDU1698:Just a Hook(线段树区间更新)

    Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...

  8. hdu - 1689 Just a Hook (线段树区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 n个数初始每个数的价值为1,接下来有m个更新,每次x,y,z 把x,y区间的数的价值更新为z(1<= ...

  9. HDU 1698 Just a Hook 线段树区间更新、

    来谈谈自己对延迟标记(lazy标记)的理解吧. lazy标记的主要作用是尽可能的降低时间复杂度. 这样说吧. 如果你不用lazy标记,那么你对于一个区间更新的话是要对其所有的子区间都更新一次,但如果用 ...

随机推荐

  1. win7不需要密码访问网络共享文件(转载)

    大家是不是觉得,共享一个文件夹后,每次输入密码都很麻烦呢?有没有不需要输入密码就可以访问共享文件的方法呢? 答案是肯定的,当然有,下面介绍下win7不需要密码访问网络共享文件 工具/原料 两台电脑在局 ...

  2. BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割

    十分简单的一道题. 图这么小,跑一边 Floyd 就得到第一问最短路径的答案. 考虑第二问怎么求:我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$. 我们发现,只要 $G$ 的起点与终点 ...

  3. python与php生成二维码对比

    php生成二维码 include 引入的库单独下载 <?php header("Content-type:text/html;charset=utf-8"); error_r ...

  4. Centos 7.2 安装和卸载 MySQL 5.7

    一.背景 闲暇之余在虚拟机安装了 Centos 7.2 系统,按照 <简单安装MySQL(RPM方式)> 这篇文章安装 MySQL ,发现由于包依赖的问题安装失败,于是索性在官网查询相关文 ...

  5. YII实现dropDownList 联动事件

    因功能需求,需要用到联动,特此记录分享 一.视图中 <div class="main-form"> <?php $form = ActiveForm::begin ...

  6. 2015 Multi-University Training Contest 6 hdu 5362 Just A String

    Just A String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. HDU 4767

    昨晚苦恼了一晚,因为即将大三了,必须要准备实习什么的事了.一般都会去公司实习吧,但是看看自己的简历,实在拿不出手,因为大一大二都在搞ACM(虽然真正搞的只有大二一年),但却没有什么成绩,又不愿意做项目 ...

  8. JAVAEE之--------过滤器设置是否缓存(Filter)

    在网页中.每次的client訪问server.有部分不用反复请求.如有些图片,视频等就没有必要每次都请求,这样会让server增大工作量.为了防止这样.我们採用过滤器来设置client是都缓存. 參考 ...

  9. Hit 2255 Not Fibonacci

    今天下午刚起来眼睛就比較涨,,并且还有点恶心,唉.结果一直不在状态.并且这个题太坑了.. .. 点击此处即可传送 Hit 2255 Maybe ACMers of HIT are always fon ...

  10. Android 推断程序在手机中是否是活动状态或者正在执行状态

    沈阳斌子在今天项目需求上碰到个这种问题,在Service中须要推断当前的程序是否是活动状态,换句话说也就是说后台跑的服务中有业务需求检測当前程序是否是该服务的程序 这样好让点击推送通知时跳转到不同的页 ...