杭电 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)
上一篇 2022年2月1日 下午1:00
下一篇 2022年2月1日 下午1:00


相关推荐

  • python协程系列_python scrapy

    python协程系列_python scrapy协程的定义协程(Coroutine),又称微线程,纤程。(协程是一种用户态的轻量级线程)作用:在执行A函数的时候,可以随时中断,去执行B函数,然后中断B函数,继续执行A函数(可以自动

    2022年7月31日
    6
  • shell 脚本返回上级目录_cmd返回上级目录

    shell 脚本返回上级目录_cmd返回上级目录cmd 返回上级目录时间 2019 11 0323 01 00 作者 路由君来源 路由器之家路由器之家今天精心准备的是 cmd 返回上级目录 下面是详解 cmd 返回上一层目录是哪个命令 cmd 返回上一层目录的命令是 cd 或 cd cd 和 之间可以加空格 然后按回车键 Enter 键 即可执行命令 返回上一层 示例场景如下 进入电脑 D 盘根目录 然后进入 soft 文件夹

    2026年3月26日
    2
  • 静态路由特点及其配置

    静态路由特点及其配置许多人错误地认为静态路由很简单,就一个命令,没什么好学的。其实这是因为他们根本没有深入理解静态路由的工作原理,对于仅有一条静态路由配置命令中的各参数和选项的含义和使用方法也是一知半解,结果造成的是遇到一些静态路由故障时无法进行分析,而对于一些静态路由配置也无法区分是否正确。本文将全面介绍静态路由的各主要特点,以及Cisco设备中的静态路由配置命令详解解释7.1.3 静态路由的主要特点 …

    2026年3月5日
    6
  • 装饰者设计模式(java版本)

    装饰者设计模式(java版本)

    2021年8月3日
    72
  • cookie模拟登录「建议收藏」

    我这里使用的是python中的requests.get(url,headers,cookies).其中headers和cookies都是字典形式。headers作用是模拟浏览器,告诉服务器我不是爬虫。cookies作用是模拟用户,告诉服务器我不是机器人,我是某某用户。以知乎为例,headers可以用模板:headers={‘Host’:’www.zhihu.com’,’User-Agent’…

    2022年4月15日
    77
  • AdventureWorks2008R2安装过程可能会遇到的一些问题及解决方案

    AdventureWorks2008R2安装过程可能会遇到的一些问题及解决方案AdventureWorks2008R2范例数据库对于学习SQLServer2008R2是一个非常好的学习案例库,里面包含了一些详尽的数据库案例(官网下载)。但是如果直接安装的话,可能会遇到一些问题,下面介绍安装的一些必要前提:1.安装的数据库账户应具有系统权限。2.你所安装的数据库至少是”SQLServerExpresswithAdvancedServices“版本(我所安…

    2025年10月29日
    3

发表回复

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

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