HDU 1698 Just a Hook(线段树模板之区间替换更新,区间求和查询)
Just a Hook
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 43184 Accepted Submission(s): 20748
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.
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.
10
2
1 5 2
5 9 3
一个钩子,有n段,开始每一段的价值是1
q给更新操作
a,b,c
a段开始到b段 价值全部替换为c
问你最后钩子的总价值是多少
- #include<stdio.h>
- #include<iostream>
- #include<vector>
- #include <cstring>
- #include <stack>
- #include <cstdio>
- #include <cmath>
- #include <queue>
- #include <algorithm>
- #include <vector>
- #include <set>
- #include <map>
- #include<string>
- #include<math.h>
- #define max_v 100005
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- typedef long long LL;
- LL sum[max_v<<],add[max_v<<];
- struct node
- {
- int l,r;
- int mid()
- {
- return (l+r)/;
- }
- }tree[max_v<<];
- void push_up(int rt)//向上更新
- {
- sum[rt]=sum[rt<<]+sum[rt<<|];
- }
- void push_down(int rt,int m)//向下更新
- {
- if(add[rt])//若有标记,则将标记向下移动一层
- {
- add[rt<<]=add[rt];
- add[rt<<|]=add[rt];
- sum[rt<<]=add[rt]*(m-(m>>));
- sum[rt<<|]=add[rt]*(m>>);
- add[rt]=;//取消本层标记
- }
- }
- void build(int l,int r,int rt)
- {
- tree[rt].l=l;
- tree[rt].r=r;
- add[rt]=;
- if(l==r)
- {
- sum[rt]=;
- //scanf("%I64d",&sum[rt]);
- return ;
- }
- int m=tree[rt].mid();
- build(lson);
- build(rson);
- push_up(rt);//向上更新
- }
- void update(int c,int l,int r,int rt)
- {
- if(tree[rt].l==l&&tree[rt].r==r)
- {
- add[rt]=c;
- sum[rt]=(LL)c*(r-l+);
- return ;
- }
- if(tree[rt].l==tree[rt].r)
- return ;
- push_down(rt,tree[rt].r-tree[rt].l+);//向下更新
- int m=tree[rt].mid();
- if(r<=m)
- update(c,l,r,rt<<);
- else if(l>m)
- update(c,l,r,rt<<|);
- else
- {
- update(c,l,m,rt<<);
- update(c,m+,r,rt<<|);
- }
- push_up(rt);//向上更新
- }
- LL getsum(int l,int r,int rt)
- {
- if(tree[rt].l==l&&tree[rt].r==r)
- return sum[rt];
- push_down(rt,tree[rt].r-tree[rt].l+);//向下更新
- int m=tree[rt].mid();
- LL res=;
- if(r<=m)
- res+=getsum(l,r,rt<<);
- else if(l>m)
- res+=getsum(l,r,rt<<|);
- else
- {
- res+=getsum(l,m,rt<<);
- res+=getsum(m+,r,rt<<|);
- }
- return res;
- }
- int main()
- {
- int n,m;
- int t;
- int a,b,c;
- int cas=;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d",&n);
- build(,n,);
- scanf("%d",&m);
- while(m--)
- {
- scanf("%d %d %d",&a,&b,&c);
- update(c,a,b,);
- }
- printf("Case %d: The total value of the hook is %I64d.\n", cas++,getsum(,n,));
- }
- return ;
- }
- /*
- 题目意思:
- 一个钩子,有n段,开始每一段的价值是1
- q给更新操作
- a,b,c
- a段开始到b段 价值全部替换为c
- 问你最后钩子的总价值是多少
- 区间更新:替换更新
- 区间查询:求和
- */
HDU 1698 Just a Hook(线段树模板之区间替换更新,区间求和查询)的更多相关文章
- HDU 1698 Just a Hook(线段树 区间替换)
Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...
- HDU 1698 Just a Hook(线段树成段更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1698 just a hook 线段树,区间定值,求和
Just a Hook Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1 ...
- HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)
题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3, 初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这 ...
- [HDU] 1698 Just a Hook [线段树区间替换]
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- (简单) HDU 1698 Just a Hook , 线段树+区间更新。
Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...
- HDU 1698 Just a Hook 线段树+lazy-target 区间刷新
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1698 Just a Hook(线段树区间更新查询)
描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...
- HDU 1698 Just a Hook(线段树区间替换)
题目地址:pid=1698">HDU 1698 区间替换裸题.相同利用lazy延迟标记数组,这里仅仅是当lazy下放的时候把以下的lazy也所有改成lazy就好了. 代码例如以下: # ...
- HDU 1698 Just a Hook 线段树区间更新、
来谈谈自己对延迟标记(lazy标记)的理解吧. lazy标记的主要作用是尽可能的降低时间复杂度. 这样说吧. 如果你不用lazy标记,那么你对于一个区间更新的话是要对其所有的子区间都更新一次,但如果用 ...
随机推荐
- Java方法的参数传递方式为: 值传递
Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...
- vue-video监听touch事件
vue-video是基于 Vue 的简洁 HTML5 视频播放器组件,但是并没有监听touch事件,也就是说在移动端按键无效. 本文讲述如何改写其vue组件,使其兼容移动端.只需要在其原有的mouse ...
- drupal7 判断用户是否具有某个权限
user_access() 具体用法可参考http://www.drupalla.com/node/857
- CSS样式之a标签(原文网址http://www.divcss5.com/shili/s57.shtml)
这是个人在做网站的时候整理的关于a标签的使用方法,整理一下,方便下次使用. 一.a超链接的代码 <a href="http://www.baidu.com" target=& ...
- css动画笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Add map surrounds using the SymbologyControl
/ Copyright 2010 ESRI// // All rights reserved under the copyright laws of the United States// and a ...
- 微信小程序“满月”:尝鲜之后你还用过它吗?
距离 2017 年 1 月 9 日微信小程序上线,整整过去了一个月时间.和互联网时代每天出现的众多新鲜事物相似,小程序甫一诞生,立即占据了各大科技媒体网站头屏并引起社交圈的兴奋讨论.由于背靠微信,纷纷 ...
- seo关键词
除非你站有很高的权重. 小道消息称keywords曾被百度.谷歌.雅虎等搜索引擎剔除,将不会再影响搜索引擎的排序结果,小编认为设置一下总没坏处,还是有一些搜索引擎比较重视keywords标签的. 用法 ...
- ssm单项目整合
目录 前言 创建maven项目 添加依赖 配置文件 总览 jdbc配置 mybatis配置 dao层配置 service层配置 事务配置 controller配置 web.xml 使用 前言 spri ...
- C#关于微信昵称中存在的表情图标乱码解决
//在获取微信用户信息时加密保存到数据库 System.Web.HttpUtility.UrlEncode("需要加密的字段") //前端在展示是解码 <script typ ...