HDU 1398:Just a Hook(线段树区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698
Just a Hook
Now Pudge wants to do some operations on the hook.
Let us number the consecutive metallic sticks of the hook from 1 to N. For each operation, Pudge can change the consecutive metallic sticks, numbered from X to Y, into cupreous sticks, silver sticks or golden sticks.
The total value of the hook is calculated as the sum of values of N metallic sticks. More precisely, the value for each kind of stick is calculated as follows:
For each cupreous stick, the value is 1.
For each silver stick, the value is 2.
For each golden stick, the value is 3.
Pudge wants to know the total value of the hook after performing the operations.
You may consider the original hook is made up of cupreous sticks.
For each case, the first line contains an integer N, 1<=N<=100,000, which is the number of the sticks of Pudge’s meat hook and the second line contains an integer Q, 0<=Q<=100,000, which is the number of the operations.
Next Q lines, each line contains three integers X, Y, 1<=X<=Y<=N, Z, 1<=Z<=3, which defines an operation: change the sticks numbered from X to Y into the metal kind Z, where Z=1 represents the cupreous kind, Z=2 represents the silver kind and Z=3 represents the golden kind.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000010
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
int sum[N<<],add[N<<];
struct node
{
int l,r;
int value;
}tree[N<<];
/*
Update 区间更新
Query 直接求根节点的sum
使用Lazy标记
Lazy标记的学习:http://blog.sina.com.cn/s/blog_a2dce6b30101l8bi.html
*/
void PushUp(int rt)
{
//自底向上更新
sum[rt]=sum[rt<<]+sum[rt<<|];
} void BuildTree(int L,int R,int rt)
{
add[rt]=;
if(L==R){
sum[rt]=;
return ;
}
int m=(L+R)>>;
BuildTree(lson);
BuildTree(rson);
PushUp(rt);
} void PushDown(int rt,int m)
{
//处理lazy标记,自顶向下更新
if(add[rt]){
add[rt<<]=add[rt];
add[rt<<|]=add[rt];
sum[rt<<]=add[rt]*(m-(m>>));
sum[rt<<|]=add[rt]*(m>>);
add[rt]=;
}
} void Update(int l,int r,int c,int L,int R,int rt)
{
if(add[rt]==c) return ;
if(L>=l&&R<=r){
add[rt]=c;
sum[rt]=c*(R-L+);
return ;
}
PushDown(rt,R-L+);
int m=(R+L)>>;
if(l<=m) Update(l,r,c,lson);
if(r>m) Update(l,r,c,rson);
PushUp(rt);
} int main()
{
int cas=;
int t;
scanf("%d",&t);
while(t--){
int n,q;
scanf("%d%d",&n,&q);
BuildTree(,n,);
while(q--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
Update(a,b,c,,n,);
}
printf("Case %d: The total value of the hook is %d.\n",++cas,sum[]);
}
return ;
}
HDU 1398:Just a Hook(线段树区间更新)的更多相关文章
- (简单) HDU 1698 Just a Hook , 线段树+区间更新。
Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...
- HDU 1698 Just a Hook(线段树区间更新查询)
描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...
- hdu - 1689 Just a Hook (线段树区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 n个数初始每个数的价值为1,接下来有m个更新,每次x,y,z 把x,y区间的数的价值更新为z(1<= ...
- HDU 1698 Just a Hook 线段树区间更新、
来谈谈自己对延迟标记(lazy标记)的理解吧. lazy标记的主要作用是尽可能的降低时间复杂度. 这样说吧. 如果你不用lazy标记,那么你对于一个区间更新的话是要对其所有的子区间都更新一次,但如果用 ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- Just a Hook 线段树 区间更新
Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- HDU 1698 Just a Hook(线段树 区间替换)
Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...
- [HDU] 1698 Just a Hook [线段树区间替换]
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- SICP 1.29-1.33
1.29 (define (sum term a next b) (if (> a b) (+ (term a) (sum term (next a) next b)))) (define (c ...
- Java CLASSPATH 引发的问题
# 问题 在做 OJ 的时候,由于程序需要编译运行,出于安全性考虑,我选择利用类 ProcessBuilder ,一个通过命令行调用 Java 程序的类. 我在 Eclipse 中或者在 CMD 中执 ...
- DSP Builder 12.0安装及crack方法
在安装dsp_builder之前请确保已安装所需要的matlab版本 在此之前我已经安装了matlab R2011a,下面安装dsp builder 下面就是破解了,因为12.0的版本刚出,还没有相应 ...
- Struts2之Struts2
Struts2-2.5.5版本是目前为止最新的版本了,相对于之前的2.3版本以及再之前的版本而言,新版本改动了很多. 好了,废话不多说,GO CODE! 基本jar包: web.xml核心配置,这里要 ...
- DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
- delphi xe5 中TMemo控件的应用——for android
TMemo中的两个方法: TMemo.Lines.Add(stringxxx);意思是向TMemo中增加字符串stringxxx: TMemo.Lines.Text :=stringxxx,意思是清空 ...
- WCF研究-后篇
最后就对之前的资料进行整理以及在其他博客园的朋友那看到的资料稍微分享一下,这样有助于学习和使用WCF的朋友更好的学习和理解WCF 后期要是看到合适的资料也会再次编辑这个后篇,让我共同进步! 后篇 1. ...
- Windows系统版本判定那些事儿(有图,各种情况,很清楚)
前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度讨论下Windows获取系统版本的方法和遇到的一些问题.在Win8和Win10出来之后,在获取 ...
- Excel导入导出各种方式分析
1.引言 1.1解决哪些问题 现在很多公司用的导出基本上采用的通过gridView导出excel,此种导出存在以下几种问题 1.数据量大的时候有时导出有时会让浏览器卡死,因为导出的excel不是真 ...
- Java多线程同步工具类之CountDownLatch
在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...