时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho:

假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi。小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP。第二种操作是询问——小Hi给出一段区间[L, R],而小Ho要做的便是计算出所有标号在这段区间中的商品的总价格,然后告诉小Hi。

那么这样的一个问题,小Ho该如何解决呢?

提示:推动科学发展的除了人的好奇心之外还有人的懒惰心!

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第1行为一个整数N,意义如前文所述。

每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量Pi。

每组测试数据的第3行为一个整数Q,表示小Hi进行的操作数。

每组测试数据的第N+4~N+Q+3行,每行分别描述一次操作,每行的开头均为一个属于0或1的数字,分别表示该行描述一个询问和一次商品的价格的更改两种情况。对于第N+i+3行,如果该行描述一个询问,则接下来为两个整数Li, Ri,表示小Hi询问的一个区间[Li, Ri];如果该行描述一次商品的价格的更改,则接下来为三个整数Li,Ri,NewP,表示标号在区间[Li, Ri]的商品的价格全部修改为NewP。

对于100%的数据,满足N<=10^5,Q<=10^5, 1<=Li<=Ri<=N,1<=Pi<=N, 0<Pi, NewP<=10^4。

输出

对于每组测试数据,对于每个小Hi的询问,按照在输入中出现的顺序,各输出一行,表示查询的结果:标号在区间[Li, Ri]中的所有商品的价格之和。

样例输入
  1. 10
  2. 4733 6570 8363 7391 4511 1433 2281 187 5166 378
  3. 6
  4. 1 5 10 1577
  5. 1 1 7 3649
  6. 0 8 10
  7. 0 1 4
  8. 1 6 8 157
  9. 1 3 4 1557
样例输出
  1. 4731
  2. 14596
  3.  
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define lson l, mid, num << 1
  5. #define rson mid + 1, r, num << 1 | 1
  6. using namespace std;
  7. int const MAX = 1e5 + ;
  8. int tre[MAX << ], laz[MAX << ];//左乘4
  9.  
  10. void push_down(int num)
  11. {
  12. tre[num] = tre[num << ] + tre[num << | ];
  13. }
  14.  
  15. void push_down(int num, int ln, int rn)
  16. {
  17. if (laz[num])
  18. {
  19. tre[num << ] = ln * laz[num];
  20. tre[num << | ] = rn * laz[num];
  21. laz[num << ] = laz[num];
  22. laz[num << | ] = laz[num];
  23. laz[num] = ;
  24. }
  25. return;
  26. }
  27.  
  28. void build(int l, int r, int num)
  29. {
  30. laz[num] = ;
  31. if (l == r)
  32. {
  33. scanf("%d", &tre[num]);
  34. return;
  35. }
  36. int mid = (l + r) >> ;
  37. build(lson);
  38. build(rson);
  39. push_down(num);
  40. return;
  41. }
  42.  
  43. void update(int L, int R, int val, int l, int r, int num)
  44. {
  45. if (L <= l && r <= R)
  46. {
  47. tre[num] = (r - l + ) * val;
  48. laz[num] = val;
  49. return;
  50. }
  51. int mid = (l + r) >> ;
  52. push_down(num, mid - l + , r - mid);
  53. if (L <= mid)
  54. update(L, R, val, lson);
  55. if (mid < R)
  56. update(L, R, val, rson);
  57. push_down(num);
  58. return;
  59. }
  60.  
  61. int query(int L, int R, int l, int r, int num)
  62. {
  63. if (L <= l && r <= R)
  64. return tre[num];
  65. int mid = (l + r) >> ;
  66. push_down(num, mid - l + , r - mid);
  67. int ans = ;
  68. if (L <= mid)
  69. ans += query(L, R, lson);
  70. if (mid < R)
  71. ans += query(L, R, rson);
  72. return ans;
  73. }
  74.  
  75. int main()
  76. {
  77. int n, q;
  78. scanf("%d", &n);
  79. build(, n, );
  80. scanf("%d", &q);
  81. while (q--)
  82. {
  83. int tp, l, r, val;
  84. scanf("%d", &tp);
  85. if (tp == )
  86. {
  87. scanf("%d %d %d", &l, &r, &val);
  88. update(l, r, val, , n, );
  89. }
  90. else
  91. {
  92. scanf("%d %d", &l, &r);
  93. printf("%d\n", query(l, r, , n, ));
  94. }
  95. }
  96. system("pause");
  97. return ;
  98. }

线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)的更多相关文章

  1. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  2. HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  4. HDU1698_Just a Hook(线段树/成段更新)

    解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...

  5. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  6. HDU-1698-Just a Hook-区间更新+线段树成段更新

    In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. T ...

  7. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  8. 【线段树成段更新-模板】【HDU1698】Just a Hook

    题意 Q个操作,将l,r 的值改为w 问最后1,n的sum 为多少 成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更 ...

  9. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

随机推荐

  1. 每天一道算法题(11)——栈的push、pop 序列

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...

  2. queue队列模块

    import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的 ...

  3. jquery获取元素在文档中的位置信息以及滚动条位置(转)

    jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886     原文链接 原创 201 ...

  4. Educational Codeforces Round 56 (Rated for Div. 2) E(1093E) Intersection of Permutations (树套树,pb_ds)

    题意和分析在之前的链接中有:https://www.cnblogs.com/pkgunboat/p/10160741.html 之前补题用三维偏序的cdq的分治A了这道题,但是感觉就算比赛再次遇到类似 ...

  5. centos系统查看本机IP地址

    centos系统查看本机IP地址,输入 ifconfig -a查看 centos查询上网公网IP输入 curl ifconfig.me 命令即可查看 centos查询上网网关IP,tracepath  ...

  6. tomcat启动时加载配置文件 报错

    原因:  @serice("customerService")  和@Repository(value="customerDao")       解决: 直接@ ...

  7. 前端学习笔记2017.6.12 CSS控制DIV

    前一篇文章中用div布局了豆瓣东西的页面,如果用html代码表示的话大概是这个样子的 <!DOCTYPE html><html><head></head> ...

  8. python常用uuid模块

    uuid.uuid4(),会根据我们当前的网卡和时间生成的一个随机字符串. 注意:uuid.uuid4()生成的是一个对象,需要强转为字符串. uid = str(uuid.uuid4()) #当前网 ...

  9. C#知识点总结系列:3、C#中Delegate和Event

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  10. socket socket讲解

    socket  socket讲解 一.socket是何物? 参考百度百科: http://baike.baidu.com/link?url=4YNURsJLEaL0II79C68gPUoYKliXWJ ...