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]和 线段树维护区间和 . 建树的时候初始 ...
随机推荐
- 利用win10自带的系统配置禁止开机启动项和程序
一.利用win10自带的系统配置禁止开机启动项和程序 首先打开"运行"对话框,可以通过开始菜单打开运行,也可以按下快捷键WIN+R打开"运行".如下图. ...
- Git问题集锦
1.初始新建git,出现No refs in common and none specified; doing nothing 解决方案:Perhaps you should specify a br ...
- 浅谈Maven
最近的有用到Maven 所以就大概跟大家谈一下Maven 1什么是Maven? Maven我个人的理解就是项目架包管理 通俗易懂的来说就是管理配置你项目中的所有jar包的 废话不多说 Maven去ht ...
- java 之 简单工厂模式(大话设计模式)
以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...
- C++语言中的类型(一)
--分门别类是简化事物最有效的方式. 类型是C++语言的基础,对象类型决定了能对该对象进行的操作. 一.基本内置数据类型 C++预先定义的基本内置数据类型是构造世界万物的原子,数据类型告诉我们数据的意 ...
- 【Win 10 应用开发】UI Composition 札记(八):用 XamlLight 制作灯光效果
前面老周已介绍过灯光的使用,如果你忘了,请用九牛二虎之力猛点击这里去复习一下.本篇老周再介绍另一种添加灯光的方法,这种方法是专为 XAML 元素而设计的,可以很方便地为可视化元素添加灯光效果. 不知道 ...
- HTML5能否会成为Web技术的核心?
谁会成为HTML5后继者? 那么会有一个HTML6吗? Jaffe表示,网上支付可能会推动进行这样的全面修订,以期能为网上支付来提供一个统一方式.如果大家将之称为HTML 6,那么HTML 6是极有可 ...
- C语言之浮点数
#include<stdio.h> int main(){printf("请分别输入身高的英尺和英寸," "如输入\"5 7\"表示5英尺 ...
- RPC是什么
RPC是什么? 通俗的讲就是,调用远程计算机上的服务,就像调用本地服务一样.通常包含传输协议和编码协议. RPC可以基于HTTP或TCP协议,但基于HTTP协议的RPC性能却不如基于TCP协议的RPC ...
- 用vue2.x注册一个全局的弹窗alert组件
一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...