题目传送

长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作。修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少个

我们用一个数组\(add[i]\)来表示第\(i\)段增量,如果查询区间完全包含第\(i\)段,那么就相当于是在原数组中查找大于等于\(C-add[i]\)的数,怎么找?排序后二分找。而对于左右不完整的那部分,直接暴力查询就可以。

对于修改操作。整段的直接增加增量,不完整的直接修改原数组,然后重新排序即可。

假设一段长度为\(t\) 则复杂度\(O(C(t+{nlog(t)\over t}))\)

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N],b[N],be[N],L[N],R[N],add[N];
char op[3];
int l,r,x;
int n,m;
void change(int l,int r,int x){
int p = be[l],q = be[r];
if(p == q){
for(int i=l;i<=r;i++)a[i] += x;
for(int i=L[p];i<=R[p];i++)b[i] = a[i];
sort(b+L[p],b+R[p]+1);
}
else{
for(int i=p+1;i<=q-1;i++)add[i] += x;
for(int i=l;i<=R[p];i++)a[i] += x;
for(int i=L[p];i<=R[p];i++)b[i] = a[i];
sort(b+L[p],b+R[p]+1);
for(int i=L[q];i<=r;i++)a[i] += x;
for(int i=L[q];i<=R[q];i++)b[i] = a[i];
sort(b+L[q],b+R[q]+1);
}
}
void solve(int l,int r,int x){
int res = 0;
int p = be[l],q = be[r];
if(p == q){
for(int i=l;i<=r;i++){
if(a[i] + add[p] >= x)res++;
}
printf("%d\n",res);return;
}
else{
for(int i=p+1;i<=q-1;i++){
res += (R[i]-L[i]+1) - (lower_bound(b+L[i],b+R[i]+1,x-add[i]) - (b+L[i]));
}
for(int i=l;i<=R[p];i++)if(a[i] + add[p] >= x)res++;
for(int i=L[q];i<=r;i++)if(a[i] + add[q] >= x)res++;
printf("%d\n",res);return ;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i] = a[i];
int t = sqrt(n);
for(int i=1;i<=t;i++){
L[i] = (i - 1) * t + 1;
R[i] = i * t;
}
if(R[t] < n)t++,L[t] = R[t-1] + 1,R[t] = n;
for(int i=1;i<=t;i++)for(int j=L[i];j<=R[i];j++)be[j] = i;
for(int i=1;i<=t;i++){
sort(b+L[i],b+R[i]+1);
}
while(m--){
scanf("%s%d%d%d",op,&l,&r,&x);
if(op[0] == 'M')change(l,r,x);
else solve(l,r,x);
}
return 0;
}

最新文章

  1. AtomicBoolean介绍与使用
  2. Java异常处理和设计
  3. js 打印星星金字塔
  4. Windows内存小结
  5. css隔行换色
  6. J. Bottles 二维费用背包问题
  7. 【兄弟连】2016高洛峰新版PHP培训视频教程
  8. Layout( 布局)
  9. Ubuntu第一次使用调教教程
  10. ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)
  11. 字符函数库 cctype
  12. ice grid配置使用第二篇------实际使用
  13. windows下tensorflow的安装
  14. JS CKEditor使用setData后绑定click事件
  15. Django REST framework+Vue 打造生鲜超市(五)
  16. js间隔一段时间打印数据库中的值
  17. unity 改变鼠标样式的两种方法
  18. 如何在socket编程的Tcp连接中实现心跳协议
  19. 使用排序数组/链表/preorder构建二叉搜索树
  20. HSSFWorkBooK用法 —Excel表的导出和设置

热门文章

  1. 8. 格式化器大一统 -- Spring的Formatter抽象
  2. 【Java基础】常用类
  3. python中列表的insert和append的效率对比
  4. &#127881; Element UI for Vue 3.0 来了!
  5. Restful API是什么、为什么、怎么使用
  6. 【UML】基本介绍与类图(依赖、泛化、实现、关联、聚合、组合关系)
  7. REUSE_ALV_FIELDCATALOG_MERGE函数
  8. JavaScript小案例-阶乘!
  9. libuv工作队列
  10. SSL_ERROR_WANT_READ