hdu1698 线段树(区间更新~将区间[x,y]的值替换为z)
Just a Hook
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 45600 Accepted Submission(s): 21730
the game of DotA, Pudge’s meat hook is actually the most horrible thing
for most of the heroes. The hook is made up of several consecutive
metallic sticks which are of the same length.
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.
input consists of several test cases. The first line of the input is
the number of the cases. There are no more than 10 cases.
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.
each case, print a number in a line representing the total value of the
hook after the operations. Use the format in the example.
10
2
1 5 2
5 9 3
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = + ;
int t, n, x, y, z, q, tre[maxn * ], laz[maxn * ], kase = ;
void push_up(int num)
{
tre[num] = tre[num * ] + tre[num * + ];
}
void pushdown(int num, int x, int y)
{
if (laz[num])
{
int mid = (x + y) / ;
laz[num * ] = laz[num * + ] = laz[num];
tre[num * ] = (mid - x + ) * laz[num];
tre[num * + ] = (y - mid) * laz[num];
laz[num] = ;
}
}
void build(int x, int y, int num)
{
int mid = (x + y) / ;
laz[num] = ;
if (x == y)
{
tre[num] = ; return;
}
build(x, mid, num * );
build(mid + , y, num * + );
push_up(num);
}
void update(int le, int ri, int z, int x, int y, int num)
{
int mid = (x + y) / ;
if (le <= x && y <= ri)
{
laz[num] = z;
tre[num] = z * (y - x + );//先更新节点,但不继续往下更新,节点的值恰好是节点所在子树的和
return;
}
pushdown(num, x, y);
if (le <= mid)
update(le, ri, z, x, mid, num * );
if (mid < ri)
update(le, ri, z, mid + , y, num * + );
push_up(num);
}
int query(int le, int ri, int x,int y,int num)
{
if (le == ri)
{
return tre[num];
}
pushdown(num, x, y);
int mid = (le + ri) / ;
if (x <= mid)
return query(le, mid, x, y, num * );
else
return query(mid + , ri, x, y, num * + );
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &q);
build(, n, );
while (q--)
{
scanf("%d%d%d", &x, &y, &z);//将[x,y]的值更新为z
update(x, y, z, , n, );
}
printf("Case %d: The total value of the hook is %d.\n", ++kase, tre[]);
}
return ;
}
hdu1698 线段树(区间更新~将区间[x,y]的值替换为z)的更多相关文章
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- hdoj 2795 Billboard 【线段树 单点更新 + 维护区间最大值】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)
题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...
- nyoj 568——RMQ with Shifts——————【线段树单点更新、区间求最值】
RMQ with Shifts 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 In the traditional RMQ (Range Minimum Q ...
- hdu 1754 线段树 单点更新 动态区间最大值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu1166(线段树单点更新&区间求和模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...
- hdu1698 线段树区间更新
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
随机推荐
- Python01 python入门介绍
1 python简介 1.1 为什么学python python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van ...
- winform 公共控件 ListView
//数据显示,刷新 public void F5() { listView1.Items.Clear(); List<Students> Stu = new StudentsData(). ...
- mac上virtualBox的安装和使用
一.下载和安装 去oracle官网下载mac版的virtualBox. 官网下载地址:https://www.virtualbox.org/. 下载好后按照向导进行安装即可. 二.使用方法 1.新建虚 ...
- CH24C 逃不掉的路
edcc缩点之后跳倍增lca 丢个edcc缩点模板 Code: #include <cstdio> #include <cstring> using namespace std ...
- html 连接数据库
http://blog.csdn.net/haxker/article/details/4214001 http://www.cnblogs.com/chuncn/archive/2010/11/22 ...
- Android ExpandableListView的使用
一.MainActivity要继承ExpandableListActivity.效果是当单击ListView的子项是显示另一个ListView. package com.example.explear ...
- [译]Javascript数列的push和pop方法
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 存储过程自动更新ID
DECLARE @i int --更新题序编号 UPDATE UserAnswer SET @i=@i+,TestOrder=@i WHERE UserScoreID=' //根据ID 累加更新
- 动态变更Repeater控件HeaderTemplate列名
本博文,Insus.NET教你动态实现变更Repeater控件HeaderTemplate列名.一般情况之下,是不需要动态变更,只有动态有Repeater控件不变情况之下,来显示多种数据源进行绑定.这 ...
- javascript js获取url及url参数解析
js获取url及url参数解析 一.获取url: var url=window.location.herf; 二.url参数解析: function GetRequest() { var url = ...