题意:

给定一个数列,您需要支持以下两种操作:
给[l,r]同加一个数
询问[l,r]中有多少数字大于或等于v

(n<=1000000,m<=3000)

题解

块内排序二分查询
修改就用个数组存整块的修改值
不完整的部分都暴力修改和查询
时间复杂度大概O(Qsqrt(n)logn)

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. const int N=;
  8. int n,m,a[N],b[N],block[N],L[],R[],cnt[],ans,Block;
  9. int find(int x,int y){
  10. int l=L[x];int r=R[x];
  11. int tmp=;
  12. while(l<=r){
  13. int mid=(l+r)>>;
  14. if(b[mid]>=y){
  15. tmp=mid;
  16. r=mid-;
  17. }
  18. else l=mid+;
  19. }
  20. return max(,R[x]-tmp+);
  21. }
  22. int main(){
  23. scanf("%d%d",&n,&m);
  24. Block=sqrt(n);
  25. for(int i=;i<=n;i++){
  26. scanf("%d",&a[i]);
  27. b[i]=a[i];
  28. block[i]=(i-)/Block+;
  29. if(!L[block[i]])L[block[i]]=i;
  30. R[block[i]]=i;
  31. }
  32. for(int i=;i<=block[n];i++)sort(b+L[i],b++R[i]);
  33. char s[];
  34. while(m--){
  35. scanf("%s",s);
  36. if(s[]=='A'){
  37. int l,r,c;
  38. ans=;
  39. scanf("%d%d%d",&l,&r,&c);
  40. if(block[l]==block[r]){
  41. for(int i=l;i<=r;i++)if(a[i]+cnt[block[i]]>=c)ans++;
  42. printf("%d\n",ans);
  43. continue;
  44. }
  45. for(int i=l;i<=R[block[l]];i++)if(a[i]+cnt[block[i]]>=c)ans++;
  46. for(int i=L[block[r]];i<=r;i++)if(a[i]+cnt[block[i]]>=c)ans++;
  47. if(block[l]+<block[r])
  48. for(int i=block[l]+;i<=block[r]-;i++)ans+=find(i,c-cnt[i]);
  49. printf("%d\n",ans);
  50. }
  51. else{
  52. int l,r,c;
  53. scanf("%d%d%d",&l,&r,&c);
  54. if(block[l]+<block[r])
  55. for(int i=block[l]+;i<=block[r]-;i++)cnt[i]+=c;
  56. for(int i=l;i<=R[block[l]];i++)a[i]+=c;
  57. for(int i=L[block[l]];i<=R[block[l]];i++)b[i]=a[i];
  58. sort(b+L[block[l]],b++R[block[l]]);
  59. for(int i=L[block[r]];i<=r;i++)a[i]+=c;
  60. for(int i=L[block[r]];i<=R[block[r]];i++)b[i]=a[i];
  61. sort(b+L[block[r]],b++R[block[r]]);
  62. }
  63. }
  64. return ;
  65. }

「BZOJ3343」教主的魔法(分块+二分查找)的更多相关文章

  1. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

  2. 【BZOJ3343】教主的魔法 分块+二分

    Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...

  3. 【bzoj3343】教主的魔法 分块

    [bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...

  4. 「 Luogu P2801 」 教主的魔法——分块

    # 解题思路 修改,就是一个区间修改的常规操作,但是为了迎合查询的需要,对两端的不完整的块需要暴力重构,重新进行排序操作,保证每一块都是单调上升的顺序. 然后再说进行查询的操作,起初,我们需要在每一个 ...

  5. 【BZOJ-3343】教主的魔法 分块

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 950  Solved: 414[Submit][Status][Discuss ...

  6. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  7. Bzoj 3343: 教主的魔法 分块,二分

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 364[Submit][Status][Discuss ...

  8. BZOJ_3343_教主的魔法_分块+二分查找

    BZOJ_3343_教主的魔法_分块+二分查找 题意:教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为 ...

  9. 「ZJOI2018」胖(ST表+二分)

    「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...

随机推荐

  1. MFC补码原码反码转换工具

    /*_TCHAR str[100] = { 0 }; wsprintf(str, _T("%d"),num);*/ ; CString str; m_edit1.GetWindow ...

  2. SVN 部分常用命令

    1. svn status 提交前显示出本地文本和版本库文本的区别 [url=] L abc.c # svn已经在.svn目录锁定了abc.c M bar.c # bar.c的内容已经在本地修改过了 ...

  3. pgpool-II在故障切换过程中是如何选举新主节点的

    在pgpool的源代码中有有一个pgpool_main.c文件,在该文件中有一个pgpool的主函数pgpoolmain控制着pgpool的运行及相关操作. libpcp_ext.h文件中定义了pgp ...

  4. php面向对象的基础:OOP的常量

    常量(constant) 用来表示不会改变的值.对于从该类实例化的任何对象来说,常量值在这些对象的整个生命周期中都保持不变. class Computer{ const PI=3.1415926; } ...

  5. Synchronization (computer science)

    过程同步.数据同步. In computer science, synchronization refers to one of two distinct but related concepts: ...

  6. 路飞学城Python-Day15

    模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...

  7. How Javascript works (Javascript工作原理) (七) WebAssembly 对比 JavaScript 及其使用场景

    个人总结: 1.webworkers实现了用多线程浏览器来进行多线程操作js的能力. 2.web workers不能操作dom,window,document等对象,一般用于cpu计算型的任务.   ...

  8. js中获取数据类型

    ES5中,js中数据类型:number.string.boolean.undefined.null.object js中获取数据类型常用的四种方式 实例: var a = 123, b = true, ...

  9. 安装 glusterfs yum源报错

    yum install glusterfs-server yum 一直报错 把/etc/yum.repos.d 备份 删除了所有文件,从测试机192..168.59.128上同步过来 一直报错 已加载 ...

  10. [LeetCode] 155. minStack 设计最小栈

    注意:getMin()时间复杂度为O(1) 最原始的方法: class MinStack(object): def __init__(self): """ initial ...