链接:

https://loj.ac/problem/6278

题意:

给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数。

思路:

分块,用vector维护每个区域的数值,每次通过二分去找满足的值.

每次单个修改时

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. //#include <memory.h>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <algorithm>
  10. #include <math.h>
  11. #include <stack>
  12. #include <string>
  13. #include <assert.h>
  14. #include <iomanip>
  15. #define MINF 0x3f3f3f3f
  16. using namespace std;
  17. typedef long long LL;
  18. const int MAXN = 5e4+10;
  19. int a[MAXN], Tag[MAXN];
  20. int Rank[MAXN];
  21. vector<int> Vec[MAXN];
  22. int n, part;
  23. void Re(int pos)
  24. {
  25. Vec[pos].clear();
  26. for (int i = (pos-1)*part+1;i <= min(pos*part, n);i++)
  27. Vec[pos].push_back(a[i]);
  28. sort(Vec[pos].begin(), Vec[pos].end());
  29. }
  30. void Update(int l, int r, int c)
  31. {
  32. for (int i = l;i <= min(r, Rank[l]*part);i++)
  33. a[i] += c;
  34. Re(Rank[l]);
  35. if (Rank[l] != Rank[r])
  36. {
  37. for (int i = (Rank[r]-1)*part+1;i <= r;i++)
  38. a[i] += c;
  39. Re(Rank[r]);
  40. }
  41. for (int i = Rank[l]+1;i <= Rank[r]-1;i++)
  42. Tag[i] += c;
  43. }
  44. int Query(int l, int r, int v)
  45. {
  46. int cnt = 0;
  47. for (int i = l;i <= min(r, Rank[l]*part);i++)
  48. {
  49. if (a[i] + Tag[Rank[i]] < v)
  50. cnt++;
  51. }
  52. if (Rank[l] != Rank[r])
  53. {
  54. for (int i = max((Rank[r]-1)*part+1, l);i <= r;i++)
  55. {
  56. if (a[i]+Tag[Rank[i]] < v)
  57. cnt++;
  58. }
  59. }
  60. for (int i = Rank[l]+1;i <= Rank[r]-1;i++)
  61. cnt += lower_bound(Vec[i].begin(), Vec[i].end(), v-Tag[i])-Vec[i].begin();
  62. return cnt;
  63. }
  64. int main()
  65. {
  66. scanf("%d", &n);
  67. part = sqrt(n);
  68. for (int i = 1;i <= n;i++)
  69. scanf("%d", &a[i]);
  70. for (int i = 1;i <= n;i++)
  71. {
  72. Rank[i] = (i - 1) / part + 1;
  73. Vec[Rank[i]].push_back(a[i]);
  74. }
  75. for (int i = 1;i <= Rank[n];i++)
  76. sort(Vec[i].begin(), Vec[i].end());
  77. int op, l, r, c;
  78. for (int i = 1;i <= n;i++)
  79. {
  80. scanf("%d %d %d %d", &op, &l, &r, &c);
  81. if (op == 0)
  82. Update(l, r, c);
  83. else
  84. printf("%d\n", Query(l, r, c*c));
  85. }
  86. return 0;
  87. }

LOJ-6278-数列分块入门2(分块)的更多相关文章

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

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

  2. LOJ#6278. 数列分块入门 2

    在一个区间上进行操作,一种操作是某个小区间都加上c,另一个查找这个区间内大于c*c的数 我们可以另外开一个数组在保存a中的每个分块内的相对值,然后每次对a加值,并把a的值赋给b,不同的是b内的各个分块 ...

  3. LOJ 6278 数列分块入门2

    [题解] 分块.块内排序.块内二分出第一个大于等于c的数. #include<cstdio> #include<algorithm> #include<cmath> ...

  4. LibreOJ 6278 数列分块入门 2(分块)

     题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...

  5. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

  6. LOJ.6281.数列分块入门5(分块 区间开方)

    题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...

  7. LibreOJ 6277 数列分块入门 1(分块)

    题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...

  8. [Libre 6281] 数列分块入门 5 (分块)

    水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...

  9. LibreOJ 6280 数列分块入门 4(分块区间加区间求和)

    题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...

  10. LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)

    题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...

随机推荐

  1. 64位编译器下,将指针转换成UINT32,不需要修改编译选项的编码方式

    一些严格的64位编译器,将指针转换成UINT32,会报各种丢失精度的错误. 但很显然,有些时候,我们就是需要转换,且并不会真正丢失精度. 此时不需要修改编译选项的编码方式,有些用处了 示例如下: un ...

  2. java:easyui(jQueryEasyUI,分页)

    1.介绍: jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写复杂的ja ...

  3. Oracle常用操作表空间sql脚本

    --删除用户(如果用户下面有对象,需要加cascade参数) drop user zxasrs cascade; --修改表空间为离线 alter tablespace zxasrs offline; ...

  4. Golang基础(8):go interface接口

    一:接口概要 接口是一种重要的类型,他是一组确定的方法集合. 一个接口变量可以存储任何实现了接口方法的具体值.一个重要的例子就是io.Reader和io.Writer type Reader inte ...

  5. 关于java中设计原则总结(7)

    开闭原则: 对于类,模块函数等扩展要开放,对于修改要关闭. 依赖倒置: 接口或抽象是高层,要面向高层编程,不应该面向实现类(实现类是低层)去变成. 单一职责: 对一个类,或者一个功能,只用负责一个职责 ...

  6. Sqlserver2012 sa账户登录添加其他账户

    1.添加admin账户的设置 2.另外 sa登录后,点击服务器名,右键->属性->安全性 的设置: 3.其次是Sqlserver配置管理器,SQL Server服务需要重启: SQL Se ...

  7. [转帖]vim搜索及高亮取消

    vim搜索及高亮取消 https://www.cnblogs.com/soymilk2019/p/10744027.html 哎 竟然一直不知道. 1. 命令模式下,输入:/字符串 比如搜索user, ...

  8. ALS部署Spark集群入坑记

    [Stage 236:> (0 + 0) / 400]17/12/04 09:45:55 ERROR yarn.ApplicationMaster: User class threw excep ...

  9. Yii2实现命名范围scope的自定义查询

    Yii中存在scope命名范围这个概念,Yii2里已经废弃了,在实际的项目开发情景中,我们有时需要用到命名范围这种自定义查询 使用场景: cate为栏目分类表,现在需要查询出栏目分类列表中所有的顶级分 ...

  10. 【三】Django模版的使用

    作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用 ...