Just a Hook HDU - 1698

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.

思路:区间更新。。。如果在该区间的所有点都被更新则更新区间,否则标记该区间;并查找它的子区间。。

#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <cstring>
#include <iostream>
#include<algorithm>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
#define N 100005
#define LL long long

int n, m;

struct td
{
    int l, r, sum;
}tree[N*4];

void ju(int t)
{
    if(tree[2*t].sum==tree[2*t+1].sum)
    {
        tree[t].sum=tree[2*t].sum;
    }
    else
    {
        tree[t].sum=-1;
    }
}

void build(int t, int l, int r)
{
    tree[t].l=l;
    tree[t].r=r;
    if(l==r)
    {
        tree[t].sum=1;
        return;
    }
    int mid=(l+r)/2;
    build(2*t, l, mid);
    build(2*t+1, mid+1, r);
    ju(t);
}

void up(int t, int l, int r, int x)
{
     if(tree[t].l==l&&tree[t].r==r)
    {
        tree[t].sum=x;
        return ;
    }
    if(tree[t].sum>0)
    {
        tree[2*t].sum=tree[t].sum;
        tree[2*t+1].sum=tree[t].sum;
    }
    int mid=(tree[t].l+tree[t].r)/2;
    if(r<=mid)
    {
        up(2*t, l, r, x);
    }
    else if(l>mid)
    {
        up(2*t+1, l, r, x);
    }
    else if(r>mid&&l<=mid)
    {
        up(2*t, l, mid, x);
        up(2*t+1, mid+1, r, x);
    }
    ju(t);
}

int qu(int t)
{
    if(tree[t].sum==0)
    {
        return 0;
    }
    if(tree[t].sum>0)
    {
        return tree[t].sum*(tree[t].r-tree[t].l+1);
    }
    int res=0;
    res+=qu(2*t);
    res+=qu(2*t+1);
    return res;
}

int main()
{
    int i, sum, x, y, T, t, z;
    scanf("%d", &T);
    for(t=1;t<=T;t++)
    {
        scanf("%d%d", &n, &m);
        build(1, 1, n);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d", &x, &y, &z);
            up(1, x, y, z);
        }
        printf("Case %d: The total value of the hook is %d.\n", t, qu(1));
    }
    return 0;
}
时间: 2024-11-02 01:47:36

Just a Hook HDU - 1698的相关文章

E - Just a Hook HDU - 1698

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 通过这个题练习了基本的Pushdown的操作 参考着蓝书的模板敲了一下,需要修改的地方就是:这里的区间修改是直接改变值而不是增加值 把+=改成=即可. 1 #include <cmath> 2 #include <queue> 3 #include <string> 4 #include <cstdio> 5 #include <cstring>

E - Just a Hook HDU 1698 (线段树+类似延迟标记)

E - Just a Hook Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice 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

E - Just a Hook - hdu 1698(区间覆盖)

某个英雄有这样一个金属长棍,这个金属棍有很多相同长度的短棍组成,大概最多有10w节,现在这个人有一种魔法,他可以把一段区间的金属棍改变成别的物质,例如金银或者铜, 现在他会有一些操作在这个金属棍上,他想知道这些操作结束后金属棍的质量是多少呢?(PS,一节铜重量1, 银 2 ,金3). 分析:如果做了那到海报覆盖的题目会发现这两题是差不多的,都可以从后面往前去覆盖,只不过返回这次能覆盖多少节就行了. *************************************************

Just a Hook HDU - 1698Just a Hook HDU - 1698 线段树区间替换

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=1e5+10; struct node{ int l,r; int sum; int add; }tr[N*4]; void pushdown(int root) { if (tr[root].add)

hdu 1698 Just a Hook 基本线段树

使用线段树更新每段区间的奖(1,2,3),最后在统计整段区间的数和,基本线段树,果断1A啊 #include<iostream> #include<stdio.h> using namespace std; #define N 100000 struct node{ int l,r,p; }a[N*4]; int n; void build(int left,int right,int i){ a[i].l=left; a[i].r=right; a[i].p=1; if(a[i]

线段树(成段更新) HDU 1698 Just a Hook

题目传送门 1 /* 2 线段树-成段更新:第一题!只要更新区间,输出总长度就行了 3 虽然是超级裸题,但是用自己的风格写出来,还是很开心的:) 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <iostream> 11 using namesp

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 (线段树 成段更新 lazy-tag思想)

题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3,  初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这个区间值不统一,而且已经向下更新了, val != -1表示这个区间值统一, 更新某个区间的时候只需要把这个区间分为几个区间更新就行了, 也就是只更新到需要更新的区间,不用向下更新每一个一直到底了,在更新的过程中如果遇到之前没有向下更新的, 就需要向下更新了,因为这个区间的值已经不统一了. 其实这就

HDU - 1698 Just a Hook (线段树区间修改)

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.