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]和 线段树维护区间和 . 建树的时候初始 ...
随机推荐
- AngularJS学习篇(十八)
AngularJS API AngularJS 全局 API 用于执行常见任务的 JavaScript 函数集合,如: 比较对象 迭代对象 转换对象 全局 API 函数使用 angular 对象进行访 ...
- js中的路由匹配
routie插件:http://projects.jga.me/routie/ /** * 路由 * @example * routie( * { * '/':function(){ }, * '/m ...
- 浅析is和as两个关键词在类型转换时的使用
is检查对象是否兼容与指定类型,返回Boolean值true或者false,值得注意的是,在使用is进行类型转换的时候是永远不会抛出异常的,例如: object o=new Object(); Boo ...
- linux系统下解决getch()输入数值不回显示
在linux系统下开发C 程序却会遇到系统不支持conio.h头文件,无法使用getch()不回显函数.下面就演示如何构建函数实现数值输入不回显. #include <stdio.h> # ...
- PHP小技巧
1.js获取服务器年月日 var date= '<?php echo date("Y-m-d",time())?>';//获取服务器年月
- 项目实战1—LNMP的搭建、nginx反向代理和缓存等的实现
实战一:搭建lnmp及类小米等商业网站的实现 环境:关闭防火墙,selinux 1.安装包,开启服务 yum -y install nginx mariadb-server php-fpm php-m ...
- C#实现设置完整虚拟路径
){ mHttpUrl.Append(":"); mHttpUrl.Append(port);}string mServerName = "~/AppModu ...
- mysql存储过程--学习
-- 存储过程示例一 inDROP DATABASE IF EXISTS tdemo;CREATE DATABASE tdemo CHARACTER SET=utf8; USE tdemo;CRE ...
- Makefile例子引入
Makefile规则 target ... :prerequisites... command target就是一个目标文件,可以是object file,也可以是可以执行文件,也可以是一个标签 pr ...
- (一)windows7下solr7.1.0默认jetty服务器环境搭建
windows7下solr7.1.0默认jetty服务器环境搭建 1.下载solr solr7官网地址:http://lucene.apache.org/solr/ jdk8官网地址:http://w ...