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): 18411    Accepted Submission(s): 9231

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.

题意很简单,求总区间的和。每次更新时不要更新到底层就行,更新完成时顺便求和就行。最后f[1].s即是ans.

#include<cstdio>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll __int64
#define N 200005
struct node
{
    int l,r;
    int s,v,f;  //区间和、该区间的单个点的值、f为不零则该区间有待更新值
}f[N*3];
void creat(int t,int l,int r)
{
    f[t].l=l;
    f[t].r=r;
    f[t].v=1;
    f[t].f=0;
    if(l==r)
    {
        f[t].s=1;
        return ;
    }
    int tmp=t<<1,mid=(l+r)>>1;
    creat(tmp,l,mid);
    creat(tmp|1,mid+1,r);
    f[t].s=f[tmp].s+f[tmp|1].s;
}
void update(int t,int l,int r,int v)
{
    int tmp=t<<1,mid=(f[t].l+f[t].r)>>1;
    if(f[t].l==l&&f[t].r==r)
    {
        f[t].v=f[t].f=v;
        f[t].s=(r-l+1)*v;
        return ;
    }
    if(f[t].f)      //向下更新
    {
        f[tmp].f=f[tmp|1].f=f[t].f;
        f[tmp].v=f[tmp|1].v=f[t].f;
        f[tmp].s=(f[tmp].r-f[tmp].l+1)*f[t].f;
        f[tmp|1].s=(f[tmp|1].r-f[tmp|1].l+1)*f[t].f;
        f[t].f=0;
    }
    if(r<=mid)
        update(tmp,l,r,v);
    else if(l>mid)
        update(tmp|1,l,r,v);
    else
    {
        update(tmp,l,mid,v);
        update(tmp|1,mid+1,r,v);
    }
    f[t].s=f[tmp].s+f[tmp|1].s;      //向上求和
    f[t].f=0;
}
int main()
{
    int T,i,n,q,cnt=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&q);
        creat(1,1,n);
        while(q--)
        {
            int l,r,v;
            scanf("%d%d%d",&l,&r,&v);
            update(1,l,r,v);
        }
        printf("Case %d: The total value of the hook is %d.\n",cnt++,f[1].s);
    }
    return 0;
}
时间: 2025-01-07 10:40:48

hdu 1698 Just a Hook (成段更新+总区间求和)的相关文章

POJ 3468-A Simple Problem with Integers(线段树:成段更新,区间求和)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 62228   Accepted: 19058 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 2871 Memory Control(成段更新,区间合并)

这道题在网上搜了一下题解,别人说是比hdu hotel还要变态的一题. 既然是变态题,因为它综合了线段树的几乎所有操作. 这道题的题意是: 有如下几个操作: 1:首先是Reset操作,这个操作代表的是把所有的内存空间全部都清空. 2:New x:代表的是分配一个x个内存空间,如果有内存空间的话,则输出那个内存空间的最左边的那个端点.否则,则输出Reject New 3:Free x:代表的是释放含有x这个数的内存空间.如果这个内存空间已经被释放了,那么就输出Reject Free 4:Get x

POJ 3468 线段树(成段更新,区间求和)

题目链接:http://poj.org/problem?id=3468 题意:给定一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和,对每次询问输出结果. 这个线段树运用了应用了add域优化,每个节点除了用value记录当前节点对应区间元素的和之外,还要用add域记录当前节点对应区间每个元素的增量.这样,没必要每次更新都要更新value更新到最底层每一个点,只需要将增量记录在某父节点的add域中即可,如果下次查询或者更新操作的是该父节点对应区间的子区间,

FZU1608(线段树成段更新,区间求和pushdown延迟标记结构体版)

题意:给了你一些区间,x,y,第三个参数w是效率,代表这段时间他的单位时间效率,效率总 和就是 (y-x)*w,然后有的时间段会被重复啊, 比如前面给了1,4,1,后面又给了2,4,3他们为了是的时间段1,4的效率总和最大肯定是选择  2,4区间的效率值选择3, 意思就是后面出现更好的情况就覆盖前面的,问你总得最大效率和 #include <iostream> #include <cstdio> #include <cstring> #include <strin

POJ 题目3468 A Simple Problem with Integers(线段树成段更新,区间求和)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 72251   Accepted: 22295 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): 15129    Accepted Submission(s): 7506 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing f

hdu 3379 Sequence operation(成段更新,区间合并)

http://acm.hdu.edu.cn/showproblem.php?pid=3397 线段树很好的题.涉及到的知识点:lazy操作处理异或操作和置01,区间合并. 有五种操作: 0 a b 将[a,b]变为0 1 a b 将[a,b]变为1 2 a b 将[a,b]取反 3 a b 输出[a,b]的1的个数 4 a b 输出[a,b]内最长的连续1的个数 对区间的操作与poj 3225类似.置01与取反是互斥的,一段区间上只能有一个标记,discuss里面也说了取反的时候若递归到区间全为

poj 3468 A Simple Problem with Integers (线段树 成段更新 加值 求和)

题目链接 题意: 只有这两种操作 C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000."Q a b" means querying the sum of Aa, Aa+1, ... , Ab. 分析:自己写的有点麻烦了,写的时候手残+脑残,改了好久. val+lazy*(r-l+1)表示和,如果lazy==0表示当前区间加的值不统一. 1 #include <iostream

HDU 3397 Sequence operation (线段树,成段更新,区间合并)

http://acm.hdu.edu.cn/showproblem.php?pid=3397 Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5801    Accepted Submission(s): 1713 Problem Description lxhgww got a sequence