G - Just a Hook
Description
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
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
Sample Input
Sample Output
思路:
0:代表线段被覆盖了。
1,2,3:分别代表值。
先建立线段树:
【1,10】
1
/ \
【1,5】 【6,10】
1 1
/ \ / \
【1,3】 【4,5】 【6,8】 【9,10】
1 1 1 1
/ \ / \ / \ / \
【1,2】 【3,3】【4,4】【5,5】 【6,7】【8,8】【9,9】【10,10】
1 1 1 1 1 1 1 1
/ \ / \
【1,1】 【2,2】 【6,6】 【7,7】
1 1 1 1
插入1 5 2后:
【1,10】
/ \
【1,5】 【6,10】
1
/ \ / \
【1,3】 【4,5】 【6,8】 【9,10】
1 1 1 1
/ \ / \ / \ / \
【1,2】 【3,3】【4,4】【5,5】 【6,7】【8,8】【9,9】【10,10】
1 1 1 1 1 1 1 1
/ \ / \
【1,1】 【2,2】 【6,6】 【7,7】
插入5 9 3后:
【1,10】
/ \
【1,5】 【6,10】
/ \ / \
【1,3】 【4,5】 【6,8】 【9,10】
0
/ \ / \ / \ / \
【1,2】 【3,3】【4,4】【5,5】 【6,7】【8,8】【9,9】【10,10】
1 1 1
/ \ / \
【1,1】 【2,2】 【6,6】 【7,7】
1 1 1 1
将红色的值加起来就是答案24了。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = ;
int n;//hooks的个数
int q;//operations的个数
struct Node
{
int l;//左端点
int r;//右端点
int v;//价值
}tree[MAXN * ];
void BuildTree(int t,int l,int r)
{
tree[t].l = l;
tree[t].r = r;
tree[t].v = ;
if (l == r)//为叶节点
return ;
BuildTree(t + t,l,(l + r) / );//建立左子树
BuildTree(t + t + ,(l + r) / + ,r);//建立右子树
}
void Update(int t,int l,int r,int v)
{
if (tree[t].l == l && tree[t].r == r)//区间匹配
{
tree[t].v = v;//将value覆盖
return ;
}
if (tree[t].v == v)//如果值相同,就没必要更改
return ;
if (tree[t].v > )//区间tree[t].l到tree[t].r的值要更改
{
tree[t + t + ].v = tree[t + t].v = tree[t].v;
tree[t].v = ;
}
if (r <= (tree[t].l + tree[t].r) / )//在左孩子
Update(t + t,l,r,v);
else if (l > (tree[t].l + tree[t].r) / )//在右孩子
Update(t + t + ,l,r,v);
else//横跨中点
{
Update(t + t,l,(tree[t].l + tree[t].r) / ,v);
Update(t + t + ,(tree[t].l + tree[t].r) / + ,r,v);
}
}
int GetValue(int t)
{
int ans = ;
if (tree[t].v > )
ans += (tree[t].r - tree[t].l + ) * tree[t].v;
else
{
ans += GetValue(t + t);
ans += GetValue(t + t + );
}
return ans;
}
int main(void)
{
int t,x,y,z,i = ;
scanf("%d",&t);
while (t --)
{
scanf("%d",&n);
BuildTree(,,n);//建立线段树
scanf("%d",&q);
while (q --)
{
scanf("%d%d%d",&x,&y,&z);
Update(,x,y,z);//更新区间的值
}
printf("Case %d: The total value of the hook is %d.\n",i ++,GetValue());//得到value的总值
}
return ;
}
G - Just a Hook的更多相关文章
- Flask初学者:g对象,hook钩子函数
Flask的g对象 作用:g可以可以看作是单词global的缩写,使用“from flask import g”导入,g对象的作用是保存一些在一次请求中多个地方的都需要用到的数据,这些数据可能在用到的 ...
- vue.js中英文api
全局配置 Vue.config is an object containing Vue's global configurations. You can modify its properties l ...
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
- 文件图标SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...
- GET/POST/g和钩子函数(hook)
GET请求和POST请求: 1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放在url中,并且是通过`?`的 ...
- [MetaHook] Surface hook
Hook ISurface function. #include <metahook.h> #include <vgui/ISurface.h> using namespace ...
- 理解钩子Hook以及在Thinkphp下利用钩子使用行为扩展
什么是钩子函数 个人理解:钩子就像一个”陷阱”.”监听器”,当A发送一个消息到B时,当消息还未到达目的地B时,被钩子拦截调出一部分代码做处理,这部分代码也叫钩子函数或者回调函数 参考网上说法 譬如我们 ...
- Linux LSM(Linux Security Modules) Hook Technology
目录 . 引言 . Linux Security Module Framework Introduction . LSM Sourcecode Analysis . LSMs Hook Engine: ...
- c c++ 函数入口和出口的hook(gcc 编译选项),然后打印出函数调用关系的方法
GCC Function instrumentation机制可以用来跟踪函数的调用关系,在gcc中对应的选项为“-finstrument-functions”.可查看gcc的man page来获取更详 ...
随机推荐
- 在Toast里面显示图片
关于怎么在Toast里面显示图片,首先自定义一个toast,在自定义一个布局,这个布局你想让toast显示什么样的布局就定义什么样的,然后在自定的布局中放一个ImageView,在把自己自定义 ...
- caldera
Caldera International星期一宣布将公司名称变更为SCO Group,交易代码则改为SCOX,希望SCO可以在客户群当中建立更好的品牌认同. Caldera除了有自己的Linux版本 ...
- homework03
代码实现真的是大问题……在第二次作业还没有真正实现的情况下只能写这么一篇博客来整理一下从各位大神那里看到的东西. 两个弱菜加起来同样是弱菜,所以我和我的小伙伴的配合就是悲剧的聚合. 首先,大家都说C# ...
- HDU 4884 TIANKENG’s rice shop (模拟)
TIANKENG's rice shop 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/J Description TIANKE ...
- 面试之BI-SQL--table转换
题目如下: Num 1 2 4 6 7 8 10 11 13 写条SQL语句转成下表: Column1 Column2 1 2 4 4 6 ...
- STM32实验非正式报告之DMA
前言 DMA即直接内存存取.我理解它就是一个“交通部长”抑或是一个“搬运工”,协助CPU存储或读取数据.既然它的主要工作就是“搬运”数据,服务对象自然就是内存(不太严格的说法吧,STM32中Flash ...
- SQL Select的执行顺序
1.FROM 2.ON 3.JOIN 4.WHERE 5.GROUP BY 6.WITH CUBE or WITH ROLLUP 7.HAVING 8.SELECT 9.DISTINCT 10.ORD ...
- [c++]程序的内存划分理解
全局和静态数据区:用于存放全局变量和静态变量(全局变量和局部变量) 常量数据区:用于存放常量数据 代码区:用于存储代码 栈:用于局部变量和函数参数 堆:程序员申请(程序员控制的部分,new/delet ...
- 无线路由器的“克隆MAC地址”是干什么作用的?
本文章转载:http://blog.sina.com.cn/s/blog_4c900d100102uysb.html 1.问题: 无线路由器的“克隆MAC地址”是干什么作用的?怎样使用? 2.使用背景 ...
- MEF 编程指南(三):声明导出
组合部件通过 [System.ComponentModel.Composition.ExportAttribute] 特性声明导出.MEF 有几种不同的方式声明导出,包括在部件层面(Part Leve ...