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. Orale介绍

    Oracle数据库: 是甲骨文公司的一款关系数据库管理系统 具有网格计算的框架 数据量大,并发操作比较多,实时性要求高,采取ORACLE数据库 Oracle数据库的体系结构包括物理存储结构和逻辑存储结 ...

  2. 使用dd制作文件夹的img

    du -sh originfile //先看看需要制作的源文件夹大小,假如15M dd if=/dev/zero of=new_img.img bs=1024 count=20000 //生成20M的 ...

  3. rabbimq之流控

    rabbitmq为了能够保证服务器在大量使用资源的情况下正常工作,会做流控. 所谓流控有以下两个方面.一是针对连接做流控,即降低某频率过快的发送消息.二是整体流控,即将所有消费者发送的消息丢掉,悄无声 ...

  4. 关于webapi post 使用多个参数的间接用法

    问题描述: Web Api 当使用Post提交的时候 由于只能接受一个参数 ,所以我们基本都会选择把所需要的参数,进行封装实体. 有的时候所需要的信息在其他两个实体中,还需要重新封装也不爽. 今天发现 ...

  5. tableView主从表在storyboard连线是 Selcetion Segue和Accessory Action的区别

    当按住Ctorl这样连线时会出现,当选择Selection Segue下面的push时,点击cell的任何位置都会跳转到下一个tableView,当选择Accessory Action的下面的push ...

  6. CCEA OCX

    <HTML> <HEAD> <TITLE>CCEAActiveX演示页面</TITLE> <meta http-equiv="Conte ...

  7. [SLAM]2D激光线特征提取

    Nguyen, V., et al. (2007)."A comparison of line extraction algorithms using 2D range data for i ...

  8. 【转】HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息

    HTTP 头部解释 ========================================================================================== ...

  9. WEB语言转义总结

    后台字符串嵌入前台语言输出   web语言分为后台和前台,如果后台语言嵌入方式将字符串输出到前台语言中,需要按照前台语言的要求进行转义. 因为前台各个语言都有自身的保留字符, 用于规定自身的语法格式, ...

  10. RDIFramework.NET 框架兼容各种数据库类型事务使用范例参考

    RDIFramework.NET 框架兼容各种数据库类型事务使用范例参考 RDIFramwork.NET框架对数据库的事务做了很好的控制,对多表或多条语句需要在同一事务执行提供了很好的支持,同时支持任 ...