HDU_1698 Just a Hook(线段树+lazy标记)
pid=1698">题目请点我
题解:
接触到的第一到区间更新,须要用到lazy标记。典型的区间着色问题。
lazy标记详情请參考博客:http://ju.outofmemory.cn/entry/99351
简单讲就是被lazy标记的非叶子节点所包括的全部叶子节点具有同样的性质。当更新或查询到该区间时,不再向下递归。仅对当前节点的lazy标记进行改动。
update :
假设当前区间刚好全然在目的区间内:看当前节点是否被标记。若未被标记。或者被标记了可是与要更新类型同样,不再向下更新。仅标记当前节点。若当前节点已经被标记且与要更新类型不同,运行pushdown操作。标记下移,递归进行更新。query:
假设当前节点区间在目的区间内(事实上一定在。由于题目要求1~N总的价值),若节点被标记,返回segTree[i]*(r+1-l);若当前节点未被标记或者区间不能全然覆盖,递归求解。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 100010
#define LCHILD(x) x<<1
#define RCHILD(x) x<<1|1
#define MID(x,y) (x+y)>>1
using namespace std;
int T;
int res;
int N,Q;
int segTree[MAX<<2|1];
void pushdown(int root);
void build(int root,int l,int r);
int query(int a,int b,int l,int r,int root);
void update(int a,int b,int l,int r,int root,int type);
int main()
{
scanf("%d",&T);
for( int t = 1; t <= T; t++ ){
scanf("%d",&N);
scanf("%d",&Q);
build(1,1,N);
while( Q-- ){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(a,b,1,N,1,c);
}
int res = query(1,N,1,N,1);
printf("Case %d: The total value of the hook is %d.\n",t,res);
}
return 0;
}
void build(int root,int l,int r){
if( l == r ){
segTree[root] = 1;
return ;
}
int mid = MID(l,r);
build(LCHILD(root),l,mid);
build(RCHILD(root),mid+1,r);
//非叶子节点初始为0。表示不标记
segTree[root] = 0;
}
void update(int a,int b,int l,int r,int root,int type){
//不在当前区间
if( l > b || r < a ){
return ;
}
//更新区间全然在当前区间内或者type同样
if( (l >= a && r <= b) || segTree[root] == type ){
segTree[root] = type;
return ;
}
//当前节点被标记可是type不同
if( segTree[root] != 0 ){
pushdown(root);
}
int mid = MID(l,r);
update(a,b,l,mid,LCHILD(root),type);
update(a,b,mid+1,r,RCHILD(root),type);
return ;
}
int query(int a,int b,int l,int r,int root){
//不在当前区间
if( l > b || r < a ){
return 0;
}
int mid = MID(l,r);
if( l >= a && r <= b ){
if( segTree[root] != 0 ){
//闭区间[l,r]
return segTree[root]*(r+1-l);
}
else{
return query(a,b,l,mid,LCHILD(root))+query(a,b,mid+1,r,RCHILD(root));
}
}
else{
return query(a,b,l,mid,LCHILD(root))+query(a,b,mid+1,r,RCHILD(root));
}
}
void pushdown(int root){
segTree[LCHILD(root)] = segTree[root];
segTree[RCHILD(root)] = segTree[root];
segTree[root] = 0;
return ;
}
HDU_1698 Just a Hook(线段树+lazy标记)的更多相关文章
- poj3468 线段树+lazy标记
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92921 ...
- POJ3237 Tree(树剖+线段树+lazy标记)
You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...
- 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题
题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...
- POJ 3225 线段树+lazy标记
lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...
- 线段树+Lazy标记(我的模版)
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ...
- C++-POJ2777-Count Color[线段树][lazy标记][区间修改]
分析:https://www.bilibili.com/read/cv4777102 #include <cstdio> #include <algorithm> using ...
- 线段树lazy标记??Hdu4902
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- HDU 1698 Just a Hook 线段树+lazy-target 区间刷新
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
随机推荐
- nova创建虚拟机源码分析系列之六 api入口create方法
openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...
- jsp静态与动态包含的区别和联系
1. <%@ include file=” ”%>是指令元素.<jsp:include page=” ”/>是行为元素 2. 最终编译成java文件的数目不同. * 静态包含在 ...
- ios video标签部分mp4文件无法播放的问题
问题描述: 部分MP4文件在ios的微信浏览器中无法播放,点击播放后缓冲一下之后显示叉,而另外一些mp4文件正常,同时在安卓全部下正常. 分析: h264编码的压缩级别问题导致. 苹果官方文档中对 i ...
- C#中窗体的close,dispose,以及application.exit()的区别
close关闭窗体,对象仍然存在,调用Close函数释放资源后可能还需要再次使用. dispose,销毁对象,窗体对象被回收了,也就是不存在了,Dispose函数释放的资源不再使用. applicat ...
- JavaScript数据可视化编程学习(一)Flotr2,包含简单的,柱状图,折线图,饼图,散点图
一.基础柱状图 二.基础的折线图 三.基础的饼图 四.基础的散点图 一.基础柱状图 如果你还没有想好你的数据用什么类型的图表来展示你的数据,你应该首先考虑是否可以做成柱状图.柱状图可以表示数据的变化过 ...
- JSON Web Tokens(JWT)
现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证.它有以下特点: JWT是跨不同语言的,JWT可以在 .NET, Python, ...
- C#参考之sealed密封类(转)
C# 语言参考 sealed(C# 参考) 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承.在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承. 1 ...
- django之第二天
今天学习目标: 一,路由系统 1,默认处理函数 2,动态URL 3,分级匹配 4,反射实现动态路由 二.中间件 三.Model(重点) 1,创建表 2,操作表数据 四.Form (重点) 1,用户提交 ...
- NSNotification
1.什么是NSNotification 每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似与公共栏,对象在这里注册关注每个确定Notifica ...
- 关于java' web杂谈(其实是课后作业1)1 网站系统开发需要掌握的技术
1 网站系统开发需要掌握的技术:(借鉴度娘)https://zhidao.baidu.com/question/1701850648247880220.html 需要掌握的有:Java(JavaEE) ...