题面

UOJ

Sol

玄学,不会势能分析

所以

维护区间最大最小值

把开根变成区间减法

如果最大值开根后的变化量和最小值的相等,就直接打个减法\(lazy\)

  1. # include <bits/stdc++.h>
  2. # define RG register
  3. # define IL inline
  4. # define Fill(a, b) memset(a, b, sizeof(a))
  5. # define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
  6. using namespace std;
  7. typedef long long ll;
  8. const int _(1e5 + 5);
  9. IL int Input(){
  10. RG int x = 0, z = 1; RG char c = getchar();
  11. for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
  12. for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  13. return x * z;
  14. }
  15. int n, m;
  16. struct Segment{
  17. ll mx, mn, tag, sum;
  18. } T[_ << 2];
  19. IL void Build(RG int x, RG int l, RG int r){
  20. if(l == r){
  21. T[x].mn = T[x].mx = T[x].sum = Input();
  22. return;
  23. }
  24. RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
  25. Build(ls, l, mid), Build(rs, mid + 1, r);
  26. T[x].mn = min(T[ls].mn, T[rs].mn);
  27. T[x].mx = max(T[ls].mx, T[rs].mx);
  28. T[x].sum = T[ls].sum + T[rs].sum;
  29. }
  30. IL void Adjust(RG int x, RG ll v, RG int l, RG int r){
  31. T[x].tag += v, T[x].mx += v, T[x].mn += v, T[x].sum += 1LL * (r - l + 1) * v;
  32. }
  33. IL void Pushdown(RG int x, RG int l, RG int mid, RG int r){
  34. if(T[x].tag == 0) return;
  35. Adjust(x << 1, T[x].tag, l, mid);
  36. Adjust(x << 1 | 1, T[x].tag, mid + 1, r);
  37. T[x].tag = 0;
  38. }
  39. IL void Modify2(RG int x, RG int l, RG int r, RG int L, RG int R, RG ll v){
  40. if(L <= l && R >= r){
  41. Adjust(x, v, l, r);
  42. return;
  43. }
  44. RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
  45. Pushdown(x, l, mid, r);
  46. if(L <= mid) Modify2(ls, l, mid, L, R, v);
  47. if(R > mid) Modify2(rs, mid + 1, r, L, R, v);
  48. T[x].mn = min(T[ls].mn, T[rs].mn);
  49. T[x].mx = max(T[ls].mx, T[rs].mx);
  50. T[x].sum = T[ls].sum + T[rs].sum;
  51. }
  52. IL void Modify1(RG int x, RG int l, RG int r, RG int L, RG int R){
  53. RG ll v1 = sqrt(T[x].mn), v2 = sqrt(T[x].mx);
  54. v1 -= T[x].mn, v2 -= T[x].mx;
  55. if(v1 == v2){
  56. Modify2(x, l, r, L, R, v1);
  57. return;
  58. }
  59. RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
  60. Pushdown(x, l, mid, r);
  61. if(L <= mid) Modify1(ls, l, mid, L, R);
  62. if(R > mid) Modify1(rs, mid + 1, r, L, R);
  63. T[x].mn = min(T[ls].mn, T[rs].mn);
  64. T[x].mx = max(T[ls].mx, T[rs].mx);
  65. T[x].sum = T[ls].sum + T[rs].sum;
  66. }
  67. IL ll Query(RG int x, RG int l, RG int r, RG int L, RG int R){
  68. if(L <= l && R >= r) return T[x].sum;
  69. RG int mid = (l + r) >> 1, ls = x << 1, rs = x << 1 | 1;
  70. RG ll ans = 0;
  71. Pushdown(x, l, mid, r);
  72. if(L <= mid) ans = Query(ls, l, mid, L, R);
  73. if(R > mid) ans += Query(rs, mid + 1, r, L, R);
  74. T[x].mn = min(T[ls].mn, T[rs].mn);
  75. T[x].mx = max(T[ls].mx, T[rs].mx);
  76. T[x].sum = T[ls].sum + T[rs].sum;
  77. return ans;
  78. }
  79. int main(RG int argc, RG char *argv[]){
  80. n = Input(), m = Input(), Build(1, 1, n);
  81. while(m--){
  82. RG int op = Input(), l = Input(), r = Input(), v;
  83. if(op == 1) v = Input(), Modify2(1, 1, n, l, r, v);
  84. else if(op == 2) Modify1(1, 1, n, l, r);
  85. else printf("%lld\n", Query(1, 1, n, l, r));
  86. }
  87. return 0;
  88. }

UOJ#288:基础数据结构练习题的更多相关文章

  1. 【线段树】uoj#228. 基础数据结构练习题

    get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...

  2. uoj #228. 基础数据结构练习题 线段树

    #228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...

  3. uoj#228 基础数据结构练习题

    题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...

  4. uoj#228. 基础数据结构练习题(线段树区间开方)

    题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...

  5. uoj#228. 基础数据结构练习题(线段树)

    传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...

  6. UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题

    题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...

  7. UOJ #228 - 基础数据结构练习题(势能线段树+复杂度分析)

    题面传送门 神仙题. 乍一看和经典题 花神游历各国有一点像,只不过多了一个区间加操作.不过多了这个区间加操作就无法再像花神游历各国那样暴力开根直到最小值为 \(1\) 为止的做法了,稍微感性理解一下即 ...

  8. 【UOJ#228】基础数据结构练习题 线段树

    #228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...

  9. 【UOJ228】基础数据结构练习题(线段树)

    [UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...

随机推荐

  1. JAVA将秒的总和转换成时分秒的格式

    public static void main(String[] args) { String str = "221"; int seconds = Integer.parseIn ...

  2. 省选后CTS/APIO前文化课划水记

    目前没有什么明确的目标,所以就叫划水吧. 第一周 4.9 (Tue) 早上 10:00 到学校,然后去仓库找了张桌子,搬到教室,开始自习生活. 拿出"必背古诗文",发现除了< ...

  3. ElasticSearch 从2.2升级到6.2.4所碰到的问题汇总

    1.ID的问题. 以前创建索引API直接用URL加索引Post过去就行了,或者在Kibana的开发工具中提交命令 PUT /customer?pretty 但是发现这样即使生成了索引,在ES中预览能看 ...

  4. Numpy随机数(一):超几何分布

    超几何分布 产品抽样检查中经常遇到一类实际问题,假定在N件产品中有M件不合格品,即不合格率 . 在产品中随机抽n件做检查,发现k件不合格品的概率为 ,k=0,1,2,...,min{n,M}. Num ...

  5. SPOJ - COT 路径构造主席树

    题意:给出一个带权树,多次询问路径\((u,v)\)的第k小权值 这是主席树往区间扩展到树上的套路题 由于是按路径查询,我们无法使用dfs序,但可利用主席树对父亲扩展的方法构造出链 因此要用dfs构造 ...

  6. C语言字符串的操作

    C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. ...

  7. 服务端模拟http服务请求客户端

    try { InputStream in = req.getInputStream(); int i = -1; ByteArrayOutputStream out = new ByteArrayOu ...

  8. gitlab之gitlab-runner自动部署(二)

    转载自:https://blog.csdn.net/hxpjava1/article/details/78514999 简介 gitlab-ci全称是gitlab continuous integra ...

  9. Spring Roo 想知道源码,怎么实现自动生成枯燥的有规律的文件

    简介   似乎是社区在维护的,不在 Spring 官网的 main projects 列表里,而是在 社区projects 列表里   是工具,不是像Spring Boot 一样的框架 http:// ...

  10. MVC引入SERVICE层 提高代码重用性 沟通CONTROL和MODEL

    MVC是web开发中常见的程序结构. 简单的mvc结构如下: view层:显示层. control层:业务层,集合了各种action. model层:模型层,一般和数据打交道.简单的sample:一个 ...