题目链接:

https://cn.vjudge.net/problem/FZU-1608

题目大意:

长度n,m次操作;每次操作都有三个数:a,b,c;意味着(a,b]区间单位长度的价值为c,若某段长度不曾被操作,则意味着该长度价值为0,若有一段长度有多个价值,则选取最大的。(多组输入)请输出(0,n]内最大价值和。

解题思路:

直接进行懒惰标记更新即可。

然后再直接处理出每个数字最大值即可。也就是不断pushdown懒惰标记直到每个叶子节点,这样叶子节点的懒惰标记一定是最大值。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
  6. #define Max(a, b) (a) > (b) ? (a) : (b)
  7. #define Min(a, b) (a) < (b) ? (a) : (b)
  8. #define Mem(a) memset(a, 0, sizeof(a))
  9. #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
  10. #pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
  11. using namespace std;
  12. inline int read()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
  16. while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19.  
  20. typedef long long ll;
  21. const int maxn = + ;
  22. const int MOD = ;//const引用更快,宏定义也更快
  23. #define MID(l, r) ((l) + ((r) - (l)) / 2)
  24. #define lson(o) ((o)<<1)
  25. #define rson(o) ((o)<<1|1)
  26. struct node
  27. {
  28. int l, r, lazy, sum;
  29. }tree[maxn * ];
  30. void pushup(int o)
  31. {
  32. tree[o].sum = tree[lson(o)].sum + tree[rson(o)].sum;
  33. }
  34. void pushdown(int o)
  35. {
  36. if(tree[o].lazy > )
  37. {
  38. int lc = lson(o), rc = rson(o);
  39. tree[lc].lazy = Max(tree[lc].lazy, tree[o].lazy);
  40. tree[rc].lazy = Max(tree[rc].lazy, tree[o].lazy);
  41. }
  42. }
  43. void build(int o, int l, int r)
  44. {
  45. tree[o].l = l;
  46. tree[o].r = r;
  47. if(l == r)
  48. {
  49. tree[o].lazy = tree[o].sum = ;
  50. return;
  51. }
  52. int m = MID(l, r);
  53. build(lson(o), l, m);
  54. build(rson(o), m + , r);
  55. pushup(o);
  56. }
  57. int ql, qr;
  58. int v;
  59. void update(int o)//懒惰标记
  60. {
  61. //cout<<o<<" "<<tree[o].l<<" "<<tree[o].r<<" "<<ql<<" "<<qr<<endl;
  62. if(ql <= tree[o].l && qr >= tree[o].r)tree[o].lazy = Max(tree[o].lazy, v);
  63. else
  64. {
  65. int m = MID(tree[o].l, tree[o].r);
  66. if(ql <= m)update(lson(o));
  67. if(qr > m)update(rson(o));
  68. }
  69. }
  70. void query(int o)
  71. {
  72. if(tree[o].l == tree[o].r)//如果是叶子节点,那就计算sum值
  73. {
  74. tree[o].sum = Max(tree[o].sum, tree[o].lazy);
  75. return;
  76. }
  77. pushdown(o);//不是叶子节点,那就把懒惰标记传递下去
  78. query(lson(o));
  79. query(rson(o));
  80. pushup(o);//计算总和。
  81. }
  82. int main()
  83. {
  84. int n, m;
  85. while(scanf("%d%d", &n, &m) != EOF)
  86. {
  87. Mem(tree);
  88. build(, , n);
  89. while(m--)
  90. {
  91. ql = read(), qr = read(), v = read();
  92. ql++;
  93. update();
  94. }
  95. query();
  96. printf("%d\n", tree[].sum);
  97. }
  98. return ;
  99. }

FZU-1608 Huge Mission 线段树(更新懒惰标记)的更多相关文章

  1. FZU 1608 Huge Mission(线段树)

    Problem 1608 Huge Mission Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description Oaiei ...

  2. FOJ 1608 Huge Mission 线段树

    每个节点维护一个最小值,更新发现如果大于最小值,直接向下更新.速度还可以.. #include<cstdio> #include<algorithm> #include< ...

  3. poj3468 线段树的懒惰标记

    题目链接:poj3468 题意:给定一段数组,有两种操作,一种是给某段区间加c,另一种是查询一段区间的和 思路:暴力的方法是每次都给这段区间的点加c,查询也遍历一遍区间,复杂度是n*n,肯定过不去,另 ...

  4. FZU 1608 Huge Mission

    Huge Mission Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original I ...

  5. HDU 4107 Gangster(线段树 特殊懒惰标记)

    两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...

  6. HDU 3397 线段树 双懒惰标记

    这个是去年遗留历史问题,之前思路混乱,搞了好多发都是WA,就没做了 自从上次做了大白书上那个双重懒惰标记的题目,做这个就思路很清晰了 跟上次大白上那个差不多,这个也是有一个sets标记,代表这个区间全 ...

  7. HDU 3954 Level up (线段树特殊懒惰标记)

    http://blog.csdn.net/acm_cxlove/article/details/7548087 感觉最巧的是定义了min_dis……将区间内有无英雄升级分开处理 #include &l ...

  8. 【POJ】3468 A Simple Problem with Integers ——线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

  9. POJ 3468 线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

随机推荐

  1. ant使用小结

    使用builder.xml的方式:完成的工作:打jar包并运行,其中引用了第三方jar和配置文件: <?xml version="1.0" encoding="UT ...

  2. Javad的Validator框架概述

    Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用.下边将向您系统的介绍该规范的各种特性. ...

  3. Vue2.0学习笔记:Vue事件修饰符的使用

    事件处理 如果需要在内联语句处理器中访问原生DOM事件.可以使用特殊变量$event,把它传入到methods中的方法中. 在Vue中,事件修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间 ...

  4. IDEA设置类注解和方法注解(详解)

    从eclipse工具到IDEA工具的转化,发现IDEA工具配置注释模板变的不一样了,不说废话了,直接开始 一.设置类注解模板(在创建类的时候自动填充模板) /** * @ProjectName: ${ ...

  5. java技术秘籍 转摘

  6. Oracle中常用的命令,随着学习进度总结

    原创作品,欢迎转载,转载请在文章显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10016569.html 开始之前先注意:在linux中切换到sqlp ...

  7. java 通用对象排序

    一个排序类,一个排序util? no.no.no…… 使用反射机制,写了一个通用的对象排序util,欢迎指正. 实体类: package entity; public class BaseTypeEn ...

  8. OpenStack IceHouse 部署 - 3 - 控制节点部署

    Mysql部署配置  安装 安装mysql,mysql的python绑定 apt-get install mysql-server 安装过程中会要求设定mysql的root账户的密码,这里假定设为my ...

  9. android 获取http请求json数据

    package com.my.gethttpjsondata; import java.io.BufferedReader;import java.io.ByteArrayOutputStream;i ...

  10. JS全国城市三级联动

    HTML <select id="s_province" name="s_province"></select> <select ...