题目链接:https://loj.ac/problem/6278

题目大意:中文题目

具体思路:数列分块模板题,对于更新的时候,我们通过一个辅助数组来进行,对于原始的数组,我们只是用来加减,然后这个辅助数组的作用就是对每一块进行排序,当查询的时候,如果不是整块的,我们直接通过a数组来记录,对于整块的,我们直接通过排序的辅助数组进行二分查找就可以了。

注意每一次更新,除了整块的,我们都需要进行对b数组这一整块的重新赋值,因为只是部分赋值的话,b数组已经排序了,这样的话数组的下标对应的数就已经改变了。

lower_bound查询的时候, id=lower_bound(b+l[i],b+r[i]+1,tmp)-(b+l[i]);如果是需要记录小于的个数的话,直接减去b+l[i]就是个数了。

A代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. # define ll long long
  4. const int maxn = 2e5+;
  5. const int mod = 1e8+;
  6. ll l[maxn],r[maxn],belong[maxn];
  7. ll add[maxn],a[maxn],b[maxn];
  8. int n;
  9. void buildblock()
  10. {
  11. ll tmp=(ll)sqrt(n);
  12. ll tot=n/tmp;
  13. if(n%tmp)
  14. tot++;
  15. for(ll i=; i<=n; i++)
  16. {
  17. belong[i]=(i-)/tmp+1ll;
  18. }
  19. for(ll i=; i<=tot; i++)
  20. {
  21. l[i]=(i-)*tmp+1ll;
  22. r[i]=i*tmp;
  23. }
  24. r[tot]=n;
  25. for(ll i=; i<=tot; i++)
  26. {
  27. sort(b+l[i],b+r[i]+);
  28. }
  29. }
  30. void init(int tmp){
  31. for(int i=l[tmp];i<=r[tmp];i++)b[i]=a[i];
  32. sort(b+l[tmp],b+r[tmp]+);
  33. }
  34. void update(ll st,ll ed,ll val)
  35. {
  36. if(belong[st]==belong[ed])
  37. {
  38. for(ll i=st; i<=ed; i++)a[i]+=val;
  39. init(belong[st]);
  40. return ;
  41. }
  42. for(ll i=st; i<=r[belong[st]]; i++)a[i]+=val;
  43. init(belong[st]);
  44. for(ll i=l[belong[ed]]; i<=ed; i++)a[i]+=val;
  45. init(belong[ed]);
  46. for(ll i=belong[st]+; i<belong[ed]; i++)
  47. add[i]+=val;
  48. }
  49. ll ask(ll st,ll ed,ll val)
  50. {
  51. ll ans=;
  52. if(belong[st]==belong[ed])
  53. {
  54. for(ll i=st; i<=ed; i++)
  55. {
  56. if(a[i]+add[belong[st]]<val)
  57. ans++;
  58. }
  59. return ans;
  60. }
  61. for(ll i=st; i<=r[belong[st]]; i++)
  62. {
  63. ans+=(a[i]+add[belong[st]]<val?:);
  64. }
  65. for(ll i=l[belong[ed]]; i<=ed; i++)
  66. {
  67. ans+=(a[i]+add[belong[ed]]<val?:);
  68. }
  69. for(ll i=belong[st]+; i<belong[ed]; i++)
  70. {
  71. ll tmp=val-add[i];
  72. ll id=lower_bound(b+l[i],b+r[i]+,tmp)-(b+l[i]);
  73. ans+=id;
  74. }
  75. return ans;
  76. }
  77. int main()
  78. {
  79. // freopen("hqx.in","r",stdin);
  80. scanf("%d",&n);
  81. for(int i=; i<=n; i++)
  82. {
  83. scanf("%lld",&a[i]);
  84. b[i]=a[i];
  85. }
  86. buildblock();
  87. ll op,st,ed;
  88. ll val;
  89. while(n--)
  90. {
  91. scanf("%lld %lld %lld %lld",&op,&st,&ed,&val);
  92. if(op==)
  93. {
  94. update(st,ed,val);
  95. }
  96. else if(op==)
  97. {
  98. printf("%lld\n",ask(st,ed,val*val));
  99. }
  100. }
  101. return ;
  102. }

#6278. 数列分块入门 2(询问区间内小于某个值 xx 的元素个数)的更多相关文章

  1. LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)

    #6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6   题目描述 给出 ...

  2. #6279. 数列分块入门 3(询问区间内小于某个值 xx 的前驱(比其小的最大元素))

    题目链接:https://loj.ac/problem/6279 题目大意:中文题目 具体思路:按照上一个题的模板改就行了,但是注意在整块查找的时候的下标问题. AC代码: #include<b ...

  3. LibreOJ 6278. 数列分块入门 2 题解

    题目链接:https://loj.ac/problem/6278 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的元素个数. ...

  4. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3   题目描述 给 ...

  5. LOJ #6277. 数列分块入门 1-分块(区间加法、单点查询)

    #6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  6. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

    #6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  7. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

  8. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

    #6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论   题目描述 给出一个 ...

  9. loj 数列分块入门 6 9(区间众数)

    6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...

随机推荐

  1. operation=

    x+=xxx 先执行xxx,再x=x+xxx 一个与之的问题 C(n,n/2) for (i=n;i>n/2;i--)        v*=i/(n+1-i);每次先执行i/(n+1-i),然后 ...

  2. SpringBoot整合Freemarker+Mybatis

    开发工具 , 开始 新建工程 .选择Spring Initializr 下一步 下一步,选择需要的组件 ..改一下工程名,Finish ..目录结构 首先,修改pom文件 然后,将applicatio ...

  3. Javascript的组成——EMACScript、DOM、BOM

    EMACScript:一种规范,JS必须准守它的约定,JS的核心. DOM:文档对象模型,W3C标准,JS访问HTML文档的接口. BOM:浏览器对象模型,没有统一的标准.JS访问浏览器的接口. EM ...

  4. mysql 自定义函数与自定义存储过程的调用方法

    存储过程:call  过程名(参数) 函数:      select  函数名(参数)

  5. docker swarm(当前官网示例)

    介绍 Docker Swarm 是 Docker 公司推出的官方容器集群平台,基于 Go 语言实现 作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API.各种 ...

  6. windows环境安装weblogic服务【转】【补】

    我的环境: windows: win10 professional edition jdk: C:\Program Files\Java\jdk1.6.0_45 weblogic安装目录 (WEBLO ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)

    前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进入主题介绍 ...

  8. ssm+maven+pageHelper搭建maven项目实现快速分页

    ssm+maven+pageHelper搭建maven项目实现快速分页 PageHelper分页使用: 插件的环境引入: 1.pom文件中引入分页插件的资源位置: <dependency> ...

  9. IO流--序列化流与反序列化流

    IO流--序列化流与反序列化流: 序列化流:把对象当做流一样写入到文本文件中 ObjectOutputSream(); 反序列化流:把文本文件中的流对象还原成对象ObjectInputSream(): ...

  10. tedu训练营day02

    1.Linux命令 1.关机.重启 关机 :init 0 重启 :init 6 2.rm 1.rm -rf 文件/目录 r :递归删除文件夹内的子文件夹 f :强制删除,force 2.练习 1.在用 ...