HDU 1698 Just a Hook (線段樹區間更新)
Just a Hook
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21856 Accepted Submission(s): 10963
Problem Description
In 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.
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.
The 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.
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.
For each case, print a number in a line representing the total value of the hook after the operations. Use the format in the example.
1
10
2
1 5 2
5 9 3
Case 1: The total value of the hook is 24.
2008 “Sunline Cup” National Invitational Contest
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1698
題目大意:開始區間1-n值都為1,x y z表示把區間[x, y]的值都改成z,最後輸出區間和
題目分析:基礎的線段樹區間更新
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1698
題目大意:開始區間1-n值都為1,x y z表示把區間[x, y]的值都改成z,最後輸出區間和
題目分析:基礎的線段樹區間更新
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
int const MAX = 1e5 + 5;
int sum[MAX << 2], lazy[MAX << 2];
int n, q;
void PushUp(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void PushDown(int ln, int rn, int rt)
{
if(lazy[rt])
{
sum[rt << 1] = lazy[rt] * ln;
sum[rt << 1 | 1] = lazy[rt] * rn;
lazy[rt << 1] = lazy[rt];
lazy[rt << 1 | 1] = lazy[rt];
lazy[rt] = 0;
}
return;
}
void Build(int l, int r, int rt)
{
lazy[rt] = 0;
if(l == r)
{
sum[rt] = 1;
return;
}
int mid = (l + r) >> 1;
Build(lson);
Build(rson);
PushUp(rt);
}
void Update(int L, int R, int c, int l, int r, int rt)
{
if(L <= l && r <= R)
{
sum[rt] = (r - l + 1) * c;
lazy[rt] = c;
return;
}
int mid = (l + r) >> 1;
PushDown(mid - l + 1, r - mid, rt);
if(L <= mid)
Update(L, R, c, lson);
if(mid < R)
Update(L, R, c, rson);
PushUp(rt);
return;
}
int main()
{
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
scanf("%d %d", &n, &q);
Build(1, n, 1);
while(q --)
{
int l, r, c;
scanf("%d %d %d", &l, &r, &c);
Update(l, r, c, 1, n, 1);
}
printf("Case %d: The total value of the hook is %d.\n", ca, sum[1]);
}
}
相關文章
- (hdu 1698) Just a Hook(區間更新)Hook
- HDU1698 Just a Hook【線段樹基礎:區間修改+區間查詢】Hook
- hihocoder 1078 線段樹的區間修改 (線段樹 區間更新 模板)
- HDU 1754 I Hate It (線段樹 區間最值)
- POJ 3468 A Simple Problem with Integers (線段樹 區間更新)
- Codeforces 52C (線段樹區間更新)
- hdu 2665 可持久化線段樹求區間第K大值(函式式線段樹||主席樹)持久化函式
- POJ 3468-A Simple Problem with Integers(區間更新線段樹)
- 線段樹 transformation——hdu 4578ORM
- HDU 3074 Multiply game(線段樹 單點更新)GAM
- (hdu 1754) I Hate It(線段樹基礎,單點更新)
- HDU1754 I Hate It 【線段樹基礎:點修改+區間查詢】
- POJ 2528 Mayor's posters (線段樹 區間更新+離散化)
- POJ 2528 Mayor's posters (線段樹區間更新 + 離散化)
- hdu 1754 I Hate It (線段樹)
- Codeforces 272C Dima and Staircase (線段樹區間更新 或 線性掃)AI
- 線段樹(3)——區間操作疊加
- Transformation HDU - 4578線段樹綜合操作ORM
- hdu 1754 【線段樹/RMQ】I Hate ItMQ
- hdu 3973 字串hash+線段樹字串
- 芻議線段樹 2 (區間修改,區間查詢)
- hdu4288 離線處理線段樹
- hdu 4836 The Query on the Tree(線段樹or樹狀陣列)陣列
- 線段樹維護區間等差數列
- HDU 1754 I Hate It 線段樹入門
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- HDU1166 敵兵佈陣【線段樹基礎:點修改+區間查詢】
- (hdu 1166)敵兵佈陣(線段樹入門,單點更新)
- HDU 1556 Color the ball(線段樹|樹狀陣列)陣列
- POJ 3468 A Simple Problem with Integers(線段樹區間操作)
- Java 演算法-區間求和I(線段樹)Java演算法
- 區間k小值(可持久化線段樹)持久化
- HDU 1556【區間更新+單點查詢 樹狀陣列】陣列
- POJ 3468 A Simple Problem with Integers (線段樹 區間共加)
- 1082 線段樹練習 3 區間查詢與區間修改
- hdu 1394 Minimum Inversion Number 【線段樹查詢】
- HDU 1556 Color the ball 線段樹入門題
- 區間演算法題用線段樹可以秒解?演算法