【HDU1698】 Just a Hook 【线段树入门】
原题:原题链接
题意:(机器翻译的...)
让我们将钩子的连续金属棒从1到N编号。对于每次操作,Pudge可以将连续的金属棒(从X到Y编号)改为铜棒,银棒或金棒。
钩的总值计算为N个金属棒的值的总和。更确切地说,每种棒的值计算如下:
对于每个铜棒,值为1.
对于每个银棒,值为2.
对于每个金棒,值为3.
Pudge想知道执行操作后钩子的总值。
你可能会认为原来的钩子是由铜棒组成的。
【思路】
线段树-区间更新lazy_tag
PS:原来都是1,不是0,因为这个卡了好久
#include<iostream>
#include<cstdio>
#include<cctype>
#include<algorithm>
#define MAXN 100005
using namespace std;
inline int read()
{
char chr=getchar();
int f=1,ans=0;
while(!isdigit(chr)) {if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)) {ans=ans*10;ans+=chr-'0';chr=getchar();}
return ans*f;
}
struct node{
int l,r;
int val,lazy;
int mid(){
return l+r>>1;
}
}t[MAXN<<2];
int a[MAXN];
int n,m;
void push_up(int x){//上传
t[x].val=t[x<<1].val+t[x<<1|1].val;
}
void push_down(int x){//下传
if(t[x].lazy){
t[x<<1].lazy=t[x].lazy;
t[x<<1|1].lazy=t[x].lazy;//如果是加上一个数的话,要写+=,改成一个数的话直接等于
t[x<<1].val=(t[x<<1].r-t[x<<1].l+1)*t[x<<1].lazy;
t[x<<1|1].val=(t[x<<1|1].r-t[x<<1|1].l+1)*t[x<<1|1].lazy;
t[x].lazy=0;
}
}
void build(int i,int l,int r){//建树
t[i].l=l;
t[i].r=r;
t[i].lazy=0;
if(l==r){
t[i].val=1;//初始铜棒——》 1
return;
}
build(i<<1,t[i].l,t[i].mid());
build(i<<1|1,t[i].mid()+1,t[i].r);
push_up(i);
}
void updata(int i,int l,int r,int v){//更新
if(l<=t[i].l && t[i].r<=r){
t[i].val=(t[i].r-t[i].l+1)*v;//这里要注意(r-l+1)*v,不是v
t[i].lazy=v;
return;
}
push_down(i);//记得下传
int m=t[i].mid();
if(l<=m) updata(i<<1,l,r,v);
if(r>m) updata(i<<1|1,l,r,v);
push_up(i);//...
}
int query(int i,int l,int r){
if(l<=t[i].l && t[i].r<=r) return t[i].val;
push_down(i);//敲黑板:这里不要忘了
int m=t[i].mid();
int sum=0;
if(l<=m) sum+=query(i<<1,l,r);
if(m<r) sum+=query(i<<1|1,l,r);
push_up(i);
return sum;
}
int T;
int main()
{
T=read();
int tot=0;
while(T--){
n=read();
build(1,1,n);
m=read();
while(m--){
int x=read(),y=read(),v=read();
updata(1,x,y,v);//更新
}
printf("Case %d: The total value of the hook is %d.\n",++tot,query(1,1,n));//格式很强
}
return 0;
}
【HDU1698】 Just a Hook 【线段树入门】的更多相关文章
- HDU-1698 JUST A HOOK 线段树
最近刚学线段树,做了些经典题目来练手 Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu1698 Just a Hook 线段树:成段替换,总区间求和
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Problem ...
- 【原创】hdu1698 Just a Hook(线段树→区间更新,区间查询)
学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新. 区间更新就是lazy思想,我来按照自己浅薄的理解谈谈lazy思想: 就是在数据结构中,树形结构可以线性存储(线性表 ...
- hdu1698 Just a hook 线段树区间更新
题解: 和hdu1166敌兵布阵不同的是 这道题需要区间更新(成段更新). 单点更新不用说了比较简单,区间更新的话,如果每次都更新到底的话,有点费时间. 这里就体现了线段树的另一个重要思想:延迟标记. ...
- HDU1698 Just a Hook —— 线段树 区间染色
题目链接:https://vjudge.net/problem/HDU-1698 In the game of DotA, Pudge’s meat hook is actually the most ...
- hdu-------(1698)Just a Hook(线段树区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu1698 Just a Hook 线段树
共有Q个更新,每次更新给更新的区间一个标记,表示该区间是在哪一次被更新,最后统计答案是以最近被更新的值为答案. AC代码: #include<cstdio> const int maxn= ...
- HDU1698:Just a Hook(线段树区域更新模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 Problem Description In the game of DotA, Pudge’s meat ...
- hdu1698 Just a Hook (线段树区间更新 懒惰标记)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu_1698Just a Hook(线段树)
hdu_1698Just a Hook(线段树) 标签: 线段树 题目链接 题意: 一个英雄的技能是发射一个长度为n的金属链,初始的金属链都是铁做的,标记为1,我们可以对于某个区间修改它的金属材质,如 ...
随机推荐
- mybatis批量操作(foreach)
foreach可以在SQL语句中通过拼接的方式进行集合迭代.foreach元素的属性主要有collection,item,index,separator,open,close. item属性:表示循环 ...
- 洛谷——P3906 Geodetic集合
P3906 Geodetic集合 题目描述 图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u的最短路径上的顶点被称为 ...
- models中字段参数blank和null的用法区别
blank当blank=True时,说明此处的数据可以不填,默认情况下为False,也就意味着默认情况下,所输入的数据不得空,blank是和页面表单有关,在页面需要输入参数的时候,如果在models里 ...
- BOM对象和DOM对象
一.BOM对象 BOM(Browser Object Model)是指浏览器对象模型,可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相 ...
- 6.4.1 标准库 os、os.path 与 shutil 简介
os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法,如下表所示. 方法 功能说明 access(path,mode) 按照 mode 指定的权限访问文件 ...
- JSTL 实现 为Select赋多个值
需要注意需要在.jsp文件中引入相应的类库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core ...
- 【codeforces 767D】Cartons of milk
[题目链接]:http://codeforces.com/problemset/problem/767/D [题意] 每个牛奶都有最晚可以喝的时间; 每天喝K瓶牛奶; 你有n瓶牛奶->已知每个牛 ...
- Likecloud-吃、吃、吃(洛谷 1508)
题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏 ...
- CODEVS3147 矩阵乘法2
...怎么优化都是90分,最后一个点一直T掉,有谁过了请告诉我. Program CODEVS3147; ; ..maxn,-..maxn] of longint; n,q,i,j,k,k1,k2,k ...
- 认识GIT之入门
前言 GIT是非常优秀的源代码版本管理工具,经过几年的发展,已经变得非常成熟以及流行,不同于其他的源代码管理系统,值得使用.GIT官网下载在线安装包,经常会中途退出,很有可能的原因是被墙了,所以建议使 ...