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]和 线段树维护区间和 . 建树的时候初始 ...
随机推荐
- JS是按值传递还是按引用传递?【转载】
最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?” 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference). ...
- Chrome DevTools 开发者工具 技巧 调试
https://developers.google.com/chrome-developer-tools/docs/tips-and-tricks 1.console面板多行输入 Shift + ...
- WebService--jax-spring集成
如果使用javax.jws内容编写webservice,则只能通过将程序打成jar包的形式运行,如果要想通过web容器进行发布,则需要使用其他webservice框架.下面介绍jaxws与spring ...
- 在为知笔记中使用Markdown和思维导图
为知笔记Wiz是一款很好的网摘和笔记工具,作为为知的忠实用户,我在为知收费后第一时间就购买了两年的授权,毕竟这么多年积累的资料都在为知上,我也习惯了使用Wiz来做些工作相关的笔记.为知笔记自带Mark ...
- centos6.5安装rabbitmq3.6.14
The minimum version of Erlang/OTP required to run RabbitMQ server 3.6.0 through 3.6.14 is R16B03. St ...
- MongoDB的mongos实例因无法分配mlock内存挂掉
问题版本 mongodb-v3.4.4 问题描述 mongos两天死了两次,死前遗言只有日志: 2017-11-01T11:25:27.135+0800 F - [NetworkInterfaceAS ...
- 如何在C#中使用存储过程(SQL Server 2000)
要在C#中使用存储过程,首先看看test表的创建sql语句: create table test55 ( uid int identity(1,1), class1 varchar(20), cl ...
- linux操作系统基础篇(八)
shell脚本的变量以及正则表达式 一.变量 含义:程序的运行就是一些列状态的变量->用变量值的变化去表示. 命名规则 以字母或下划线开头,剩下的部分可以是:字母.数字.下划线. 最好遵循下述规 ...
- PHP date()函数格式与用法汇总
在页面的最前页加上 date_default_timezone_set("PRC"); /*把时间调到北京时间,php5默认为格林威治标准时间*/ date () a: & ...
- Ubuntu下删除VMware的方法
一般我们都装的是Vmware workstation版的,所以,我们在终端下输入 sudo vmware-installer -u vmware-workstation 然后就会弹出vmware的卸载 ...