题目链接

一 核心:

f(x)=91 (x<=100)

f(x)=x-10 (x>100)

那么同一区间就可能不同的操作,那么该怎么解决呢?

我门直到同一区间的数据属于同一类别的时候再进行懒惰标记

区间记录最大值_max  最小值_min(同时应该有两个懒惰标记)

1) 最大值大于100 全部减去10

2)最小值小于等于100 全部变成91

注意懒惰标记的顺序,(2)应该在后面,想一想啊!

二 代码

  1. /*
  2. f(x)=91 (x<=100)
  3. f(x)=x-10 (x>101)
  4. */
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. #define lson l,m,rt*2
  8. #define rson m+1,r,rt*2+1
  9. const int N=1e5+;
  10. int sum[N*],s[*N],b[*N];
  11. int t1[N*],t2[N*];
  12. int n,q;
  13. void pushup (int rt) {
  14. sum[rt]=sum[rt*]+sum[rt*+];
  15. s[rt]=min (s[rt*],s[rt*+]);
  16. b[rt]=max (b[rt*],b[rt*+]);
  17. }
  18. void cover (int r1,int r2,int k) {
  19. t1[r2]+=t1[r1];
  20. sum[r2]-=k**t1[r1];
  21. s[r2]-=*t1[r1]; b[r2]-=*t1[r1];
  22. }
  23. void c2 (int r1,int r2,int k) {
  24. t2[r2]=;
  25. sum[r2]=*k;
  26. s[r2]=b[r2]=;
  27. }
  28. void pushdown (int rt,int l,int r) {
  29. int m=(l+r)/;
  30. if (t1[rt]) {
  31. cover (rt,rt*,m-l+);
  32. cover (rt,rt*+,r-m);
  33. t1[rt]=;
  34. }
  35. if (t2[rt]) {
  36. c2 (rt,rt*,m-l+);
  37. c2 (rt,rt*+,r-m);
  38. t2[rt]=;
  39. }
  40. return ;
  41. }
  42. void build (int l,int r,int rt) {
  43. if (l==r) {
  44. scanf ("%d",&sum[rt]);
  45. s[rt]=b[rt]=sum[rt];
  46. return ;
  47. }
  48. int m=(l+r)/;
  49. build (lson);
  50. build (rson);
  51. pushup(rt);
  52. return ;
  53. }
  54. void update (int L,int R,int l,int r,int rt) {
  55. if (l>R||r<L) return ;
  56. if (l>=L&&r<=R&&(s[rt]>||b[rt]<=)) {
  57. if (s[rt]>) {
  58. sum[rt]-=(r-l+)*;
  59. s[rt]-=; b[rt]-=;
  60. t1[rt]++;
  61. }
  62. else if (b[rt]<=) {
  63. sum[rt]=(r-l+)*;
  64. s[rt]=b[rt]=;
  65. t2[rt]=;
  66. }
  67. return ;
  68. }
  69. int m=(l+r)/;
  70. pushdown (rt,l,r);
  71. update (L,R,lson);
  72. update (L,R,rson);
  73. pushup (rt);
  74. }
  75. int query (int L,int R,int l,int r,int rt) {
  76. if (r<L||l>R) return ;
  77. if (l>=L&&r<=R) return sum[rt];
  78. int m=(l+r)/;
  79. pushdown (rt,l,r);
  80. return query (L,R,lson)+query (L,R,rson);
  81. }
  82. int main ()
  83. {
  84. while (~scanf ("%d",&n)) {
  85. memset (t1,,sizeof(t1 ));
  86. memset (t2,,sizeof(t2));
  87. build (,n,);
  88. scanf ("%d",&q);
  89. for (int i=;i<=q;i++) {
  90. int op,l,r;
  91. scanf ("%d %d %d",&op,&l,&r);
  92. if (op==) printf ("%d\n",query(l,r,,n,));
  93. else update (l,r,,n,);
  94. }
  95. }
  96. return ;
  97. }

xdoj-1279(有趣的线段树--吉司机?!)的更多相关文章

  1. bzoj4695 最假女选手(势能线段树/吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...

  2. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  3. HDU - 5306 Gorgeous Sequence (吉司机线段树)

    题目链接 吉司机线段树裸题... #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3 ...

  4. UVALive - 4108 SKYLINE (吉司机线段树)

    题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...

  5. BZOJ4355: Play with sequence(吉司机线段树)

    题意 题目链接 Sol 传说中的吉司机线段树??感觉和BZOJ冒险那题差不多,就是强行剪枝... 这题最坑的地方在于对于操作1,$C >= 0$, 操作2中需要对0取max,$a[i] > ...

  6. bzoj4355 Play with sequence(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间 ...

  7. bzoj5312 冒险(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 ...

  8. HDU - 6315 吉司机线段树

    题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值 ...

  9. 【BZOJ-4127】Abs 树链剖分 + 线段树 (有趣的姿势)

    4127: Abs Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 381  Solved: 132[Submit][Status][Discuss] ...

随机推荐

  1. mp4、AAC数据格式、解析文件的创建修改时间

    AAC文件 资料: http://blog.csdn.net/u013427969/article/details/53091594 http://blog.chinaunix.net/uid-260 ...

  2. 生成PDF文档之iText

    iTextSharp.text.Document:这是iText库中最常用的类,它代表了一个pdf实例.如果你需要从零开始生成一个PDF文件,你需要使用这个Document类.首先创建(new)该实例 ...

  3. spring boot整合shiro后,部分注解(Cache缓存、Transaction事务等)失效的问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/elonpage/article/details/78965176 前言 整合有缓存.事务的sprin ...

  4. jsp 内置对象(五)

    1.Request对象 该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以 获取用户提交的信息. 当Request对象获取客户提交的汉字字符时,会出现乱码问题,必 ...

  5. C++简单输入输出-计算火车运行时间

    //写的很差,无力tc 7-4 计算火车运行时间 (17 分) 本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间. 输入格式: 输入在一行中给出2个4位正整数,其间以空格分隔,分别 ...

  6. mysql查看和修改密码策略

    8.X版本: #查看密码策略 show variables like '%validate_password.policy%'; show variables like '%validate_pass ...

  7. Mysql 实列结构-进程

    一.MySQL后台进程简介 master thread与四大I/O线程:read thread.write thread.redo log thread.change buffer thread与 p ...

  8. 2.14 C++析构函数

    参考: http://www.weixueyuan.net/view/6345.html 总结: 析构函数就是用于回收创建对象时所消耗的各种资源. 析构函数的调用顺序与构造函数调用顺序正好是相反的. ...

  9. spring boot 发邮件

    报错:  Mail server connection failed; nested exception is javax.mail.MessagingException: Could not con ...

  10. 【模板】AC自动机(简单版)

    我:“woc...AC自动机?” 我:“可以自动AC???” 然鹅... 大佬:“傻...” 我:“(⊙_⊙)?” 大佬:“缺...” 我:“......” (大佬...卒 | 逃...) emm.. ...