2017-08-30 18:54:40

writer:pprp

可以跟上一篇博客做个对比,

这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密

代码如下:

/*
@theme:segmentation/interval T
@writer:pprp
@begin:15:26
@end:16:13
@declare: 使用lazy标记的线段树,HDU 1698
这次写的是带结构体的那种
@date:2017/8/30
*/ #include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib> using namespace std;
const int maxn = ; struct tree
{
int r, l;
int v; //lazy标记
int mid;//中间的值
} T[maxn<<]; //test:ok
void pushDown(int rt)
{
T[rt<<].v = T[rt<<|].v = T[rt].v;
T[rt].v = -; //-1代表着
} //void build(int rt, int l, int r)
//{
// T[rt].l = l, T[rt].r = r;
// T[rt].v = 1; //因为这个题中认为每个节点的值都是1
// T[rt].mid = (l+r)>>1;
// if(l == r)return ;
// //递归求解对两边进行处理
// build(rt<<1,l,T[rt].mid);
// build(rt<<1|1,T[rt].mid+1,r);
//} void build(int rt,int L,int R)
{
T[rt].l=L,T[rt].r=R;T[rt].mid = (L+R)>>;
T[rt].v=;
if(L==R){return;}
build(rt<<,L,T[rt].mid);
build(rt<<|,T[rt].mid+,R);
} void update(int rt, int L, int R, int z)
{
if(L <= T[rt].l && R >= T[rt].r) //error find
{
T[rt].v = z;
return;
}
else
{
if(T[rt].v != -) //如果不是-1也就是说之前没有被pushdown过,那就pushdown
pushDown(rt);
if(L > T[rt].mid)
update(rt<<|,L,R,z);
else if(R <= T[rt].mid)
update(rt<<,L,R,z);
else //左右都有
{
update(rt<<,L,T[rt].mid,z);
update(rt<<|,T[rt].mid+,R,z);
}
}
} //找到根节点的sum值
int Find(int rt)
{
//判断根节点是否有lazy标记
if(T[rt].v != -)
return T[rt].v * (T[rt].r-T[rt].l+);
else
return Find(rt<<) + Find(rt<<|);
} int main()
{
//freopen("in.txt","r",stdin);
int N,n,m,i,j,k,v,c=;
scanf("%d",&N);
while(N--)
{
scanf("%d %d",&n,&m);
build(,,n);
for(i=;i<=m;++i){
scanf("%d%d%d",&j,&k,&v);
update(,j,k,v);
}
printf("Case %d: The total value of the hook is %d.\n",++c,Find());
}
return ;
}

HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)的更多相关文章

  1. HDU1698 just a Hook - 带有lazy标记的线段树

    2017-08-30 16:44:33 writer:pprp 上午刚刚复习了一下不带有lazy标记的线段树, 下午开始学带有lazy标记的线段树 这个是我看大佬代码敲的,但是出了很多问题, 这提醒我 ...

  2. 带有lazy标记的线段树

    #include<bits/stdc++.h> using namespace std; ]; struct st{ int l,r,val,add; }tr[]; void build( ...

  3. HDU 1698 Just a Hook(线段树 区间替换)

    Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...

  4. HDU 1698 Just a Hook 区间更新 lazy标记

    lazy标记 #include <iostream> #include <cstdio> #include <cstring> #include <sstre ...

  5. 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)

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

  6. HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)

    题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3,  初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这 ...

  7. hdu 1698 Just a Hook 【线段树+lazy】

    题目 写了一天的线段树,这道题主要说明一下sum是赋值的,不是累加的,并且在push_down的时候lazy也是赋值的.因可能对懒标记的理解还不是很透彻吧. #include <iostream ...

  8. HDU 1698——Just a Hook——————【线段树区间替换、区间求和】

    Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...

  9. HDU 1698 Just a Hook(线段树区间替换)

    题目地址:pid=1698">HDU 1698 区间替换裸题.相同利用lazy延迟标记数组,这里仅仅是当lazy下放的时候把以下的lazy也所有改成lazy就好了. 代码例如以下: # ...

随机推荐

  1. 解决线上Tomcat启动慢

    vim /application/jdk/jre/lib/security/java.security # securerandom.source=file:/dev/randomsecurerand ...

  2. Linux命令(基础3)

    关机重启 reboot poweroff ============================ linux命令分类 1.针对不同文件的管理命令 1.1 目录 FHS 文件系统层次化标准 绝对路径: ...

  3. Java数据类型(基本数据类型和引用数据类型)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/pengkv/article/details/37564869 Java数据分为基本数据类型和引用数据 ...

  4. 使用CocoaPods管理第三方类库[效率]

    项目文件夹   加入第三方框架后的项目文件夹例如以下图 为什么要用Cocoapods?   iOS开发中经常使用的第三方库,比方: 1.FMDB:在使用SQLite是仅仅须要加入libsqlite3. ...

  5. 单舵轮(叉车)AGV里程计数据解算

    单舵轮(叉车)AGV里程计数据解算 2016-07 单舵轮AGV,一般包含一个驱动轮和两个从动轮,驱动轮是同时具备行走和转向两个功能的舵轮,因此,单舵轮AGV的运动学自由度为2个.舵轮线速度V1,舵轮 ...

  6. html读写excle文档

    import.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  7. SDUT2857:艺术联合会(简单dp)

    链接: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2857 题目解析: 这是去年校赛的题目, ...

  8. python介绍和基础(待补充)

    python的介绍 把命令放到一个文件中,文件还能执行,这样的语言叫shell脚本 写一个c语言程序,.c结尾的,gcc运行c语言程序,生成.out文件,然后执行.out文件 c语言是先编写代码,再编 ...

  9. 利用trigger同步Oracle数据库

    oracle不同数据库之间进行同步数据时,可以用触发器来实现,但需要数据库A访问数据库B,那么可以通过创建数据连接来实现,代码如下: CREATE DATABASE LINK dblink_test ...

  10. ruby中的方法查找

    ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicO ...