杭电 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • signature=26e3fa40cff08d52a53392bd149aa17b,Window Element, a Profiled Pultruded Panel, a System of a…

    signature=26e3fa40cff08d52a53392bd149aa17b,Window Element, a Profiled Pultruded Panel, a System of a…Thepresentinventiongenerallyrelatestothetechnicalfieldofhousesandbuildingsandtechniquesofbuildinghousesandbuildingsandmoreparticularlyrelatestonovelwindowelementsandpanels…

    2022年6月9日
    32
  • curl_init php_宝塔php开启curl扩展

    curl_init php_宝塔php开启curl扩展安装某些PHP源码如CMSTOP时需求系统开启curl扩展,这需要修改PHP的配置,在Windows中只需简单三步。一、window下安装php_curl支持1.将PHP安装文件夹下的三个文件php_curl.dll(可能在ext文件夹中),libeay32.dll,ssleay32.dll复制到%windir%/system32下;2.打开php.ini(可能在PHP环境的安装目录下,默认…

    2022年10月9日
    1
  • navicat最新激活码【2021最新】

    (navicat最新激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月22日
    143
  • windows cmd进入mysql[通俗易懂]

    windows cmd进入mysql[通俗易懂]在DOS命令窗口输入 mysql-hlocalhost-uroot-p回车 进入mysql数据库,其中-h表示服务器名,localhost表示本地;-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,可直接在-p后链接输入,如:-p123456,用户没有设置密码,显示Enterpassword时,直接回车即可。注意,如果你的mysql没有安装在C盘下

    2022年5月4日
    63
  • ios android 一键换机,‎App Store 上的“手机搬家 – 一键换机助手”

    ios android 一键换机,‎App Store 上的“手机搬家 – 一键换机助手”极速数据迁移,一键手机克隆,换机更便捷。数据传输工具,一键传输通讯录、照片、视频至新手机,超实用的手机一键搬家工具!没有WiFi?新旧手机换机太麻烦?流量不够用?传大文件太慢?没关系,快来试试!最酷最快的多功能文件传输应用!让你在手机间畅享极速互传。传资料不需要联网、不需要电脑、不需要数据线、不需要SIM卡、不需要WIFI,就可以一键把旧手机资料换到新手机。【给您安全、快速、简单、便捷的换机体验…

    2022年5月9日
    127
  • rpm 安装冲突「建议收藏」

    rpm 安装冲突「建议收藏」1.要安装的包比已安装的包旧,则采用降级的方式安装 rpm -Uvhkpartx-0.4.9-72.el6.x86_64.rpm –oldpackage 2.安装的包比已安装的包新,则直接升级即可 rpm -Uvhkpartx-0.4.9-72.el6.x86_64.rpm  或者末尾追加 –replacefiles  或  –repl…

    2022年5月5日
    34

发表回复

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

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