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

杭电 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 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.


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

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<iostream>
#include<sstream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<cctype>
#include<string>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int INF=100000;
int val[INF+1];
struct node//结构体表示结点
{
    int total;
    int left;
    int right;
    int mark;//是否上次被更新
} tree[INF<<2];

int create(int root,int left ,int right)//建树
{
    tree[root].left=left;
    tree[root].mark=0;
    tree[root].right=right;
    if(left==right)
        return tree[root].total=val[left];
    int a , b,middle=(left+right)>>1;
    a=create(root<<1,left,middle);
    b=create(root<<1|1,middle+1,right);
    return tree[root].total=a+b; //在回溯过程中给total赋值
}

void update_mark(int root)
{
    if(tree[root].mark)
    {//假设被延迟标记过而且此时须要在root的子孙中找须要更新的线段。无论找不找到既然研究到了
   // 此节点就要“落实”此节点total值 。并使延迟标记下移。
        tree[root].total=tree[root].mark*(tree[root].right-tree[root].left+1);
        if(tree[root].left!=tree[root].right)
            tree[root<<1].mark=tree[root<<1|1].mark=tree[root].mark;
        tree[root].mark=0;
    }
}

int calculate(int root,int left,int right)
{
    update_mark(root);//递归到每一个节点都要核实是否具有延迟标记
    if(tree[root].left>right||tree[root].right<left)
        return 0;
    if(left<=tree[root].left&&tree[root].right<=right)
        return tree[root].total;
    int a,b;
    a=calculate(root<<1,left,right);
    b=calculate(root<<1|1,left,right);
    return a+b;
}

int update(int root,int left,int right,int val)
{
    update_mark(root);
    if(tree[root].left>right||tree[root].right<left)
        return tree[root].total;
    if(tree[root].left>=left&&tree[root].right<=right)
    {
        tree[root].mark=val;
        return  tree[root].total=val*(tree[root].right-tree[root].left+1);
    }
    int a,b;
    a=update(root<<1,left,right,val);
    b=update(root<<1|1,left,right,val);
    return tree[root].total=a+b;
}

int main()
{
    int T;
    cin>>T;
    int c=0;
    while(T--)
    {
        int n,q,x,y,z;
        cin>>n;
        for(int i=1; i<=n; i++)
            val[i]=1;
        cin>>q;
        create(1,1,n);
        for(int i=0; i<q; i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            update(1,x,y,z);
        }
        printf("Case %d: The total value of the hook is %d.\n",++c,tree[1].total);
    }
    return  0;
}

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115657.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • qtabbar设置不同宽度_华为最小宽度默认

    qtabbar设置不同宽度_华为最小宽度默认随手记。因为自己搜没搜到。一行代码搞定。我是加在resizeEvent函数中的。ui.tabWidgetCentral->tabBar()->setMaximumWidth(width);修改后效果原效果

    2022年9月23日
    2
  • 30个Java自学网站

    30个Java自学网站30个Java自学网站1、learnjava官网地址:https://www.learnjavaonline.org/是一个交互式学习java的网站,所谓的交互式,就是你只需要从第一开始,按照人家的提示进行操作即可,也可以说是傻瓜式学习,你看:首先给你讲解理论知识,然后让你实际操作代码:可以直接写代码直接输出打印。是一个非常不错的Java自学网站!2、LeetCode/力扣官网地址:https://leetcode-cn.com/这是一个相当重要的网站,建议每个程序员都需要去使用这个网站

    2022年7月8日
    24
  • setfacl 权限导出_linux学习-setfacl设置特定目录用户权限

    setfacl 权限导出_linux学习-setfacl设置特定目录用户权限需求:设置用户test,test1对特定的目录有读写执行权限,后加的文件也是这个权限。-R表示递归-m表示设置文件acl规则setfacl-R-md:u:test:rwx/data2/testsetfacl-R-md:u:test1:rwx/data2/test–删除ACL规则使用-bsetfacl-R-b/data2/test上面的d:u:详见如下,而perms对应的是…

    2022年6月22日
    38
  • 用命令行 给 apk 签名

    用命令行 给 apk 签名一、需求     在腾讯开放平台把apk加固了,然后呢就让我重新签名 二、签名2.1建议将待签名的apk 和 签名(keystore或者jks)放到同一目录下,这样更方便2.2 命令行cd到该目录后运行以下命令 (注意,这里是针对同一目录下的情况,并且要保证cd到当前目录下哦),将伪命令替换掉即可jarsigner-verbose-ke

    2022年6月12日
    48
  • windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群

    windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群

    2021年12月3日
    48
  • SpringBoot启动全流程源码解析(超详细版)[通俗易懂]

    SpringBoot启动全流程源码解析(超详细版)[通俗易懂]我们在使用SpringBoot启动项目的时候,可能只需加一个注解,然后启动main,整个项目就运行了起来,但事实真的是所见即所得吗,还是SpringBoot在背后默默做了很多?本文会通过源码解析的方式深入理解SpringBoot启动全过程SpringBoot启动过程流程图源码解析大家不要抗拒源码解析,这个非常优秀的代码,我们如果能够学会对自己代码编写水平大有裨益首先,我们先来看下SpringBoot项目的启动类@SpringBootApplicationpublicclassSp.

    2025年10月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号