题意:支持区间加,询问区间中元素排名

维护两个域。一个域维护原序列,一个域维护快内排序序列。

每次修改后更新快内排序序列。

修改时O(sqrt(n)log(sqrt(n)))

询问时O(sqrt(n)log(sqrt(n)))

大概是这个量级吧

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int bl[],bla,a[],a0[],b[],bi[],n;
  5. int t1,t2,t3,t4;
  6.  
  7. void init() {
  8. bla=sqrt(n);
  9. for (int i=;i<=n;i++)
  10. bl[i]=(i-)/bla+,
  11. bi[i]=(i-)%bla+;
  12. for (int l=;l<=n;l+=bla) {
  13. for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
  14. a[i]=a0[i];
  15. sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
  16. }
  17. }
  18.  
  19. void add(int l,int r,int c){
  20. if(bl[l]==bl[r]) {
  21. for(int i=l;i<=r;i++)
  22. a0[i]+=c;
  23. for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
  24. a[i]=a0[i];
  25. sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
  26. }
  27. else {
  28. for(int i=l;i<=bl[l]*bla;i++)
  29. a0[i]+=c;
  30. for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
  31. a[i]=a0[i];
  32. sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
  33. for(int i=bl[r]*bla-bla+;i<=r;i++)
  34. a0[i]+=c;
  35. for(int i=bl[r]*bla-bla+;i<=bl[r]*bla;i++)
  36. a[i]=a0[i];
  37. sort(a+bl[r]*bla-bla+,a+bl[r]*bla+);
  38. for(int i=bl[l]+;i<bl[r];i++)
  39. b[i]+=c;
  40. }
  41. }
  42.  
  43. int query(int l,int r,long long c){
  44. int ans=;
  45. if(bl[l]==bl[r]) {
  46. for(int i=l;i<=r;i++)
  47. ans+=(a0[i]<c-b[bl[l]]);
  48. }
  49. else {
  50. for(int i=l;i<=bl[l]*bla;i++)
  51. ans+=(a0[i]<c-b[bl[l]]);
  52. for(int i=bl[r]*bla-bla+;i<=r;i++)
  53. ans+=(a0[i]<c-b[bl[r]]);
  54. for(int i=bl[l]+;i<bl[r];i++)
  55. ans+=lower_bound(a+i*bla-bla+,a+i*bla+,c-b[i])-(a+i*bla-bla+);
  56. }
  57. return ans;
  58. }
  59.  
  60. void printblock(){
  61. /*for(int i=1;i<=n/bla+(n%bla)?1:0;i++) {
  62. printf("block %d : %d\n",i,b[i]);
  63. printf(" a0: ");
  64. for(int j=1;j<=bla;j++) printf("%d ",a0[i*bla-bla+j]);
  65. printf("\n");
  66. printf(" a: ");
  67. for(int j=1;j<=bla;j++) printf("%d ",a[i*bla-bla+j]);
  68. printf("\n");
  69. }*/
  70. }
  71.  
  72. int main(){
  73. ios::sync_with_stdio(false);
  74. cin>>n;
  75. for(int i=;i<=n;i++)
  76. cin>>a0[i];
  77. init();
  78. printblock();
  79. for(int i=;i<=n;i++) {
  80. cin>>t1>>t2>>t3>>t4;
  81. if(t1==){
  82. add(t2,t3,t4);
  83. }
  84. else {
  85. printf("%d\n",query(t2,t3,t4*t4));
  86. }
  87. printblock();
  88. }
  89. }

loj6278 数列分块入门题2的更多相关文章

  1. loj6277 数列分块入门题1

    裸题分块. #include <bits/stdc++.h> using namespace std; ],b[],n,m,t1,t2,t3,t4,sq; int main(){ ios: ...

  2. [LOJ6278]数列分块入门 2

    题目大意: 给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问区间$[l,r]$中小于$c^2$的数的个数.思路 ...

  3. [loj6278]数列分块入门2

    做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...

  4. 题解——loj6278 数列分块入门2 (分块)

    查询小于k的值 注意lower_bound一定要减去查找的起始位置得到正确的位置 调了快两天 淦 #include <cstdio> #include <algorithm> ...

  5. 数列分块入门九题(三):LOJ6283~6285

    Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...

  6. 数列分块入门九题(二):LOJ6280~6282

    Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...

  7. 数列分块入门九题(一):LOJ6277~6279

    Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ...

  8. LOJ6285 数列分块入门9(分块)

    昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ...

  9. 数列分块入门1-9 By hzwer

    声明 持续更新,因为博主也是正在学习分块的知识,我很菜的,菜的抠$jio$ 写在前面 分块是个很暴力的算法,但却比暴力优秀的多,分块算法的时间复杂度一般是根号的,他的主要思想是将一个长度是$n$的数列 ...

随机推荐

  1. C# 数据类型详解以及变量、对象与内存

    学习刘铁猛老师<C#语言入门详解>视频,针对其中重点知识点进行总结. 1.什么是类型? 类型又称为数据类型(Data Type),数据类型在数据结构中的定义是一个值的集合以及定义在这个值集 ...

  2. JS数组方法(ES5、ES6)

    1. arr.push() 从后面添加元素,添加一个或多个,返回值为添加完后的数组长度 let arr = [1,2,3,4,5] console.log(arr.push(6,7)) // 7 3 ...

  3. 学习了解CSS3发展方向和CSS样式与优先级

    通过学习CSS3游戏介绍.CSS样式和优先级章节,了解到html5+css3+js不光可以实现动画,其次可以往这个游戏与建模方向发展,更多css3特效访问Gerard Ferrandez on Cod ...

  4. Python——捕获异常

    一.什么是异常 """异常:错误,bug处理异常:尝试执行某句可能出现异常的语句, 若出错则用正确的代码去替代. try: 可能发生错误的代码except: 如果出现异常 ...

  5. 阿里妈妈的iconfont的引用问题

    一.先进官网 我们看到了上面的这些图标,是不是很心动,阿里妈妈就是给力,给马老师点赞,但是问题来了我们怎么去使用呢. 二.点击图标 嘿嘿,上面的操作步骤我就不多说了吧,我相信大家都会做的,接下来我们就 ...

  6. 【redis】基于redis实现分布式并发锁

    基于redis实现分布式并发锁(注解实现) 说明 前提, 应用服务是分布式或多服务, 而这些"多"有共同的"redis"; (2017-12-04) 笑哭, 写 ...

  7. win2012 挂载硬盘即增加新硬盘方法

    这篇文章主要介绍了win2012 挂载硬盘即增加新硬盘方法,需要的朋友可以参考下 点击左下角的服务器管理图标 点击右上角的“工具”,再选择“计算机管理” 再点击“磁盘管理” 在磁盘1的按钮处单击右键, ...

  8. 清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)

    qbxt Day 2 afternoon --2020.1.18 济南 主讲:李佳实 目录一览 1.线段树 2.二叉搜索树(略过) 3.树状数组 总知识点:基础数据结构(本人初学感觉好难) 一.线段树 ...

  9. VS GIT 使用入门---我只是搬运工

    网上资料推荐 GitHub 新手详细教程 - Hanani_Jia的博客 - CSDN博客 https://blog.csdn.net/Hanani_Jia/article/details/77950 ...

  10. 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历

    /* 题目: 将二叉搜索树转化为排序的双向链表,不能创建新的节点, 只能调整节点的指向,返回双向链表的头节点. */ /* 思路: 递归. 二叉搜索树的中序遍历得到的序列是递增序列. 左子树left& ...