原题:原题链接
题意:(机器翻译的...)
让我们将钩子的连续金属棒从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;//初始铜棒——》 1return;}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,不是vt[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;
}

转载于:https://www.cnblogs.com/zhenglw/p/9507891.html

【HDU1698】 Just a Hook 【线段树入门】相关推荐

  1. HDU-1698 JUST A HOOK 线段树

    最近刚学线段树,做了些经典题目来练手 Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...

  2. hdu 1698 Just a Hook 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Let us number the consecutive metallic sticks of ...

  3. HDU 1698 Just a Hook (线段树区间修改+区间查询)

    题目链接: 传送门 题意:Pudge对装备钩子进行若干次的强化,强化分为三种分别对应的价值是1,2,3,在经历过若干次操作后,输出钩子对应的总价值,每次强化都是对钩子进行区间修改 解题思路:在明白了题 ...

  4. hdu 1698 Just a Hook(线段树区间更新·经典)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698 数据:case,n,q,q行x,y,z.在长度为n的hook上进行q次区间更新,把它们的价值改变.最 ...

  5. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  6. poj1195 Mobile phones 二维线段树入门

    二维线段树就是树套树,线段树套线段树... #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  7. hdu1166敌兵布阵hdu1754I Hate It(线段树入门)

    单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来. http://acm.hdu.edu.cn/showproblem.php?pid=1166 update单点更 ...

  8. 数据结构之线段树入门(单点更新区间查询)

    线段树是学习数据结构必须学习的一种数据结构,在ACM,蓝桥等比赛中是经常出现的.利用线段树解题,会使得题目简单易理解.而且线段树是数据结构中比较基础而且用的很多的一种. 线段树定义 线段树是一种二叉搜 ...

  9. 线段树入门 (zz)

    从简单说起,线段树其实可以理解成一种特殊的二叉树.但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构.针对性强,所以效率要高.这里又想到了一句题外话:动态和静态的差别.动态结构较为 ...

最新文章

  1. 手把手教你如何加入到github的开源世界! (转)
  2. struts2 action间跳转传值
  3. 017_Upload上传
  4. Altium Desiger18 打印 丝印简单的方法
  5. Linux网络编程 之 IO复用epoll(十)
  6. http协议工作原理(精简)
  7. 拒绝低效加班,别让“囚徒困境”限制你的职业发展
  8. 使用JSONP解决同源限制问题
  9. 使用libevhtp编写HTTP服务器的方法
  10. 微服务架构下分布式事务解决方案
  11. 扒一扒网易云课堂python课程,发现还有不少可以白嫖的免费好资源
  12. 希望Online -- 前10级快速功略 + 怪物掉的装备
  13. 成都榆熙电子商务有限公司:旗舰店都有哪些优势?
  14. CCF系列题解--2015年12月第三题 ASCII字符画
  15. 接入科大讯飞语音听写,增加语音动画,类似京东语音搜索功能
  16. github 国内替代产品_2020年7种最佳Github替代品
  17. C语言的初步简单认识
  18. 如何解决未能初始化战场服务器,解决绝地求生无法初始化steam教程详解
  19. Ruby中Time的常用函数
  20. B样条基函数的定义及系数的意义

热门文章

  1. ckfinder2上传绕过漏洞
  2. 语义分割rle编码与mask的转换
  3. 深度学习和机器学习有什么关系?机器学习包含深度学习吗?
  4. java.awt的父类,javax.swing.Japplet的父类是()。A.java.awt.panelB.java.a
  5. 手机黑卡,这个仇我是记下了
  6. HTTP请求过程 常见协议 请求类型 状态码 websocket
  7. Android读取sql文件并导入数据库
  8. [PCB]详细介绍如何使用拼板矩阵拼板
  9. 构造接口,免费查询快递物流
  10. python查看pydoc