Just a Hook

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

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 <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <algorithm>
#define LL long long using namespace std; const int Max = 110000; typedef struct Node
{
int val;//记录区间的价值 int data;//记录区间的共同的值(区间的值不相同的为零)
}Tree; Tree Tr[Max*4]; int N,Q; void Push_up(int st)//统计区间的信息
{
Tr[st].val = Tr[st<<1].val + Tr[st<<1|1].val; if(Tr[st<<1].data==Tr[st<<1|1].data&&Tr[st<<1].data)
{
Tr[st].data=Tr[st<<1].data;
}
else
{
Tr[st].data=0;
}
} void Push_down(int st,int L,int R)
{
if(Tr[st].data)
{
Tr[st<<1].data = Tr[st<<1|1].data = Tr[st].data; int mid = (L+R)>>1; Tr[st<<1].val=(mid-L+1)*Tr[st<<1].data; Tr[st<<1|1].val=(R-mid)*Tr[st<<1|1].data;
}
} void Build(int L,int R,int st)
{
Tr[st].data = 0; Tr[st].val = 0; if(R == L)
{
Tr[st].data = 1; Tr[st].val = 1; return ;
} int mid = (L+R)>>1; Build(L,mid,st<<1); Build(mid+1,R,st<<1|1); Push_up(st);
} void Update(int L,int R, int st, int l, int r, int d)
{
if(L > r ||R < l)
{
return ;
}
if(L>=l&&R<=r)
{
Tr[st].data = d; Tr[st].val=d*(R-L+1); return ;
} Push_down(st,L,R); int mid = (L+R)>>1; if(l<=mid)
{
Update(L,mid,st<<1,l,r,d);
}
if(r>mid)
{
Update(mid+1,R,st<<1|1,l,r,d);
} Push_up(st);
} int main()
{
int T; int x,y,d; scanf("%d",&T); for(int z = 1; z <= T;z++)
{
scanf("%d %d",&N,&Q); Build(1,N,1); while(Q--)
{
scanf("%d %d %d",&x,&y,&d); Update(1,N,1,x,y,d);
} printf("Case %d: The total value of the hook is %d.\n",z,Tr[1].val);
}
return 0;
}

 

Just a Hook(HDU1698 线段树的简单应用)的更多相关文章

  1. hdu1698 线段树区间更新

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. 『zkw线段树及其简单运用』

    阅读本文前,请确保已经阅读并理解了如下两篇文章: 『线段树 Segment Tree』 『线段树简单运用』 引入 这是一种由\(THU-zkw\)大佬发明的数据结构,本质上是经典的线段树区间划分思想, ...

  3. HDU1698 Just a Hook 【线段树】+【成段更新】+【lazy标记】

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. 【HDU1698】 Just a Hook 【线段树入门】

    原题:原题链接 题意:(机器翻译的...) 让我们将钩子的连续金属棒从1到N编号.对于每次操作,Pudge可以将连续的金属棒(从X到Y编号)改为铜棒,银棒或金棒. 钩的总值计算为N个金属棒的值的总和. ...

  5. hdoj 1698 Just a Hook 【线段树 区间更新】

    题目大意:有一段链子.初始的时候是铜的(价值为1),n代表有n段(1~n),输入a, b, c三个数分别表示将从a到b的链子的价值改为c, 最后问你经过多次改变之后的总价值. 策略:这道题是简单的线段 ...

  6. hdu 1698:Just a Hook(线段树,区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. HDU 1698 Just a Hook(线段树区间替换)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. HDU 1698 Just a Hook (线段树区间更新)

    题目链接 题意 : 一个有n段长的金属棍,开始都涂上铜,分段涂成别的,金的值是3,银的值是2,铜的值是1,然后问你最后这n段总共的值是多少. 思路 : 线段树的区间更新.可以理解为线段树成段更新的模板 ...

  9. hdu 1698 Just a Hook(线段树之 成段更新)

    Just a Hook                                                                             Time Limit: ...

随机推荐

  1. ZK dropEvent简单使用

    前台(Drop.zul) <?page title="拖动测试" contentType="text/html;charset=UTF-8"?> & ...

  2. 汇编寄存器(内存访问)基础知识之三---mov指令

     1 内存中字的存储 一个字型数据占2个内存单元,内存里面一个内存单元一个字节(8位),高地址单位放高8位,低地址单元放低8位. 注意:0号是地址单元,1是高地址单元(上是低地址,下面是高地址) (1 ...

  3. C++复制对象时勿忘每一部分

    现看这样一个程序: void logCall(const string& funcname) //标记记录 { cout <<funcname <<endl; } cl ...

  4. 除了白名单外的IP每秒最多处理 8 个请求 limit_conn_zone

    防止黑客知道你的源服务器真实IP进行并发攻击,通常只需要保护动态文件请求,�php. 添加文件 nginx/conf/limit/whiteip.conf 里面是你要忽略限制的 白名单 IP地址,通常 ...

  5. 20145337实验三实验报告——敏捷开发与XP实践

    20145337实验三实验报告--敏捷开发与XP实践 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 ** 实验步骤**### 敏捷开发与XP 软件工程包括下列领域:软件需求 ...

  6. Android课程---Android 如何用滑杆(SeekBar)组件设置图片颜色的透明度(转)

    Android系统支持的颜色是由4个值组成的,前3个为RGB,也就是我们常说的三原色(红.绿.蓝),最后一个值是A,也就是Alpha.这4个值都在0~255之间.颜色值越小,表示该颜色越淡,颜色值越大 ...

  7. 在 NetBeans IDE 6.0 中分析 Java 应用程序性能

    NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU ...

  8. ExtJS笔记 Ext.Loader

    Ext.Loader is the heart of the new dynamic dependency loading capability in Ext JS 4+. It is most co ...

  9. Android 更新sdk

    http://blog.csdn.net/xiao_ping_ping/article/details/45621663 不FQ意味着不能直接到android官网下载android SDK,但是国内有 ...

  10. Task示例,多线程

    class Program { static void Main(string[] args) { Run(); } public static async void Run() { var task ...