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): 31096    Accepted Submission(s): 15313

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.

Input

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.

Output

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.

Sample Input

1

10

2

1 5 2

5 9 3

Sample Output

Case 1: The total value of the hook is 24.

/*
题意:
n的数初始值为铜(1),然后把x到y之内的所有值都更新为z,
求最后的总值! (线段树的区间更新,外加延迟标记)
*/
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL N = 100000;
int n, a, b, z;
typedef struct Node {
    int l, r, sum;
    int lazy, tag;
} Tr;
Tr x[5 * N];
/*  创建线段树   */
void creat(int d, int l, int r)
{
    x[d].l = l;
    x[d].r = r;
    x[d].lazy = x[d].tag = 0;
    if(l == r) {
        x[d].sum = 1;
        return ;
    }
    int m = (l + r) / 2;
    creat(2 * d, l, m);
    creat(2 * d + 1, m + 1, r);
    x[d].sum = x[2 * d].sum + x[2 * d + 1].sum;
}
/*  区间更新模块    */
void update(int d, int l, int r, int v)
{
    if(x[d].l == l && x[d].r == r) {
        x[d].lazy = 1;
        x[d].tag = v;
        x[d].sum = (r - l + 1) * v;
        return;
    }
    int m = (x[d].l + x[d].r) / 2;
    if(x[d].lazy == 1) {
        x[d].lazy = 0;
        update(d * 2, x[d].l, m, x[d].tag);
        update(d * 2 + 1, m + 1, x[d].r, x[d].tag);
        x[d].tag = 0;
    }
    if(r <= m)
        update(d * 2, l, r, v);
    else if(l > m)
        update(d * 2 + 1, l, r, v);
    else {
        update(d * 2, l, m, v);
        update(d * 2 + 1, m + 1, r, v);
    }
    x[d].sum = x[d * 2].sum + x[2 * d + 1].sum;
}
int main()
{
    int m, T;
    while(~scanf("%d", &T)) {
        for(int it = 1; it <= T; it++) {
            scanf("%d%d", &n, &m);
            creat(1, 1, n);
            while(m--) {
                scanf("%d%d%d", &a, &b, &z);
                update(1, a, b, z);
            }
            printf("Case %d: The total value of the hook is %d.\n", it, x[1].sum);
        }
    }
    return 0;
}
时间: 2024-10-13 23:24:28

HDU 1698 Just a Hook (区间更新+延迟标记)的相关文章

HDU 1698 Just a Hook 区间更新 lazy标记

lazy标记 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <sstream> 5 #include <string> 6 #include <algorithm> 7 #include <list> 8 #include <map> 9 #include <vector> 10 #include

hdu 1698 Just a Hook (区间更新)

Problem : 1698 ( Just a Hook ) Judge Status : Accepted Language : G++ Author : dayang #include<iostream> #include<cstdio> #include<cstring> #define MID(a,b) ((a + b) >> 1) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1

杭电 HDU ACM 1698 Just a Hook(线段树 区间更新 延迟标记)

欢迎"热爱编程"的高考少年--报考杭州电子科技大学计算机学院 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 20889    Accepted Submission(s): 10445 Problem Description In the game of DotA, Pudge's meat hook

hdu 1698 线段数的区间更新 以及延迟更新

先说说区间更新和单点更新的区别 主要的区别是搜索的过程 前者需要确定一个区间 后者就是一个点就好了 贴上两者代码 void updata(int i)//单点更新 { int l=stu[i].l; int r=stu[i].r; int mid=(l+r)/2;//二分咯 if(l==r&&r==x)//x为目标id 当左右节点相同的时候 就是找到这个数的时候 { stu[i].maxx=y; return; } if(l<=x&&x<=mid) updata

hdu 1698(线段树区间更新)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 30080    Accepted Submission(s): 14859 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing

codevs 1082 线段树练习 3 区间更新+延迟标记

题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数, 再接下来一个正整数Q,每行表示操作的个数, 如果第一个数是1,后接3个正整数, 表示在区间[a,b]内每个数增加X,如果是2, 表示操作2询问区间[a,b]的和是多少. pascal选手请不要使用readln读入 输出描述 Output Description 对于每个询问输出一行

Poj 3468 A Simple Problem with Integers(线段树 区间更新 延迟标记)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 73239   Accepted: 22607 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of

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): 17214    Accepted Submission(s): 8600 Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing f

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): 15129    Accepted Submission(s): 7506 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing f