思路:

线段树区间修改,需要使用两个懒标记set和add。处理好两个标记的优先级即可(set之前的set和add是没有作用的)。

实现:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = ;
  5.  
  6. int tree[N << ], lazy_set[N << ], lazy_add[N << ], a[N], n, q;
  7.  
  8. void build(int num, int l, int r)
  9. {
  10. if (l == r) { tree[num] = a[l]; return; }
  11. int m = l + r >> ;
  12. build(num << , l, m);
  13. build(num << | , m + , r);
  14. tree[num] = tree[num << ] + tree[num << | ];
  15. }
  16.  
  17. void pushdown(int num, int cl, int cr)
  18. {
  19. if (lazy_set[num])
  20. {
  21. tree[num << ] = lazy_set[num] * cl;
  22. tree[num << | ] = lazy_set[num] * cr;
  23. lazy_set[num << ] = lazy_set[num];
  24. lazy_set[num << | ] = lazy_set[num];
  25. lazy_add[num << ] = ;
  26. lazy_add[num << | ] = ;
  27. lazy_set[num] = ;
  28. }
  29. if (lazy_add[num])
  30. {
  31. tree[num << ] += lazy_add[num] * cl;
  32. tree[num << | ] += lazy_add[num] * cr;
  33. lazy_add[num << ] += lazy_add[num];
  34. lazy_add[num << | ] += lazy_add[num];
  35. lazy_add[num] = ;
  36. }
  37. }
  38.  
  39. void update(int num, int l, int r, int x, int y, int p, int t)
  40. {
  41. if (x <= l && y >= r)
  42. {
  43. if (t == )
  44. {
  45. tree[num] += (r - l + ) * p;
  46. lazy_add[num] += p;
  47. }
  48. else
  49. {
  50. tree[num] = (r - l + ) * p;
  51. lazy_set[num] = p;
  52. lazy_add[num] = ;
  53. }
  54. return;
  55. }
  56. int m = l + r >> ;
  57. pushdown(num, m - l + , r - m);
  58. if (x <= m) update(num << , l, m, x, y, p, t);
  59. if (y >= m + ) update(num << | , m + , r, x, y, p, t);
  60. tree[num] = tree[num << ] + tree[num << | ];
  61. }
  62.  
  63. int query(int num, int l, int r, int x, int y)
  64. {
  65. if (x <= l && y >= r) return tree[num];
  66. int m = l + r >> ;
  67. pushdown(num, m - l + , r - m);
  68. int ans = ;
  69. if (x <= m) ans += query(num << , l, m, x, y);
  70. if (y >= m + ) ans += query(num << | , m + , r, x, y);
  71. return ans;
  72. }
  73.  
  74. int main()
  75. {
  76. ios::sync_with_stdio(false);
  77. cin >> n >> q;
  78. for (int i = ; i <= n + ; i++) cin >> a[i];
  79. build(, , n + );
  80. int x, y, t, p;
  81. for (int i = ; i <= q; i++)
  82. {
  83. cin >> t >> x >> y >> p;
  84. x++; y++;
  85. update(, , n + , x, y, p, t);
  86. cout << query(, , n + , , n + ) << endl;
  87. }
  88. return ;
  89. }

hihocoder1080 更为复杂的买卖房屋姿势的更多相关文章

  1. HihoCoder1080 更为复杂的买卖房屋姿势(线段树+多重lazy)

    描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产. 在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政 ...

  2. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  3. hiho#1080 更为复杂的买卖房屋姿势 线段树+区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  4. hiho1080 更为复杂的买卖房屋姿势

    题目链接: hihocoder1080 题解思路: 题目中对区间改动有两个操作: 0   区间全部点添加v 1   区间全部点改为v easy想到应该使用到两个懒惰标记  一个记录替换  一个记录增减 ...

  5. hihoCoder #1080 : 更为复杂的买卖房屋姿势 (线段树,多tag)

    题意: 有编号为0~n的n+1个房屋,给出每个房屋的起始价格,随后给出m种修改,每次修改都要进行输出所有房屋的价格总和.修改有两种方式:(1)政府调控,编号L~R全置为同一价格(0)房屋自行涨跌,编号 ...

  6. 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/pfj9NLLuKYAfJJF84R9WAw 作者:B ...

  7. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  8. 内网劫持渗透新姿势:MITMf简要指南

    声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...

  9. Android 线程的正确使用姿势

    进程优先级(Process Priority) 线程寄宿在进程当中,线程的生命周期直接被进程所影响,而进程的存活又和其优先级直接相关.在处理进程优先级的时候,大部分人靠直觉都能知道前台进程(Foreg ...

随机推荐

  1. ZOJ3496 Assignment

    传送门 这题也是真恶心-- 题目大意是俩公司要运货,每条路有容量上限.然后B公司手里有p个--(技能点?)如果在一条路上放了x个技能点,这条路经过了y个货物,那么B公司就会收x*y的钱.现在要求的是, ...

  2. P2759 奇怪的函数

    题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x 输入输出样例 输入样例# ...

  3. 如何使用 Jmeter 发送 Json 请求

    公司最近有一个项目,需要持续发送大量的 Json 请求到服务器,从而测试服务器可靠性. 我就发送 Json 请求部分发布这个博客. 一般来说, Json 请求的数据都保存到 CSV 文件中,然后使用 ...

  4. 关于yolov3 训练输出值

    Region xx: cfg文件中yolo-layer的索引: Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1: Class: 标注物体的分类准确率,越大越 ...

  5. GitHub的使用方法

    版本控制系统 > Git 分布式 > Subversion 集中式 1. 安装git: # apt-get install git //root权限 $ sudo apt-get inst ...

  6. bzoj 3809 Gty的二逼妹子序列——莫队+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 容易想到树状数组维护值域.但修改和查询都是 log 太慢. 考虑有 nsqrt(n) ...

  7. hibernate学习二 基本用法

    一  映射文件User.hbm.xml 定义了持久化类实例是如何存储和加载的,这个文件定义了持久化类和表的映射. 根据映射文件,Hibernate可以生成足够的信息以产生所有的SQL语句,也就是类的实 ...

  8. Outlook 开发

    转自:http://www.cnblogs.com/madebychina/archive/2011/09/20/madebychina_2.html C#使用如下代码调用Outlook2003发送邮 ...

  9. SQL——基础概念

    服务器登录名:指有权限登录到某服务器的用户:如sa 服务器角色:指一组固定的服务器用户,默认有9组: 登录名一定属于某些角色,默认为public 服务器角色不容许更改 登录后也不一定有权限操作数据库 ...

  10. jQuery 生成随机字符

    //获取长度为len的随机字母 //获取长度为len的随机字母 function zimu(len){ len = len || 1; var $chars = 'ABCDEFGHIJKLMNOPQR ...