P2801 教主的魔法 (分块)
2024-08-29 10:35:52
长度为\(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;
}
最新文章
- AtomicBoolean介绍与使用
- Java异常处理和设计
- js 打印星星金字塔
- Windows内存小结
- css隔行换色
- J. Bottles 二维费用背包问题
- 【兄弟连】2016高洛峰新版PHP培训视频教程
- Layout( 布局)
- Ubuntu第一次使用调教教程
- ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)
- 字符函数库 cctype
- ice grid配置使用第二篇------实际使用
- windows下tensorflow的安装
- JS CKEditor使用setData后绑定click事件
- Django REST framework+Vue 打造生鲜超市(五)
- js间隔一段时间打印数据库中的值
- unity 改变鼠标样式的两种方法
- 如何在socket编程的Tcp连接中实现心跳协议
- 使用排序数组/链表/preorder构建二叉搜索树
- HSSFWorkBooK用法 —Excel表的导出和设置
热门文章
- 8. 格式化器大一统 -- Spring的Formatter抽象
- 【Java基础】常用类
- python中列表的insert和append的效率对比
- &#127881; Element UI for Vue 3.0 来了!
- Restful API是什么、为什么、怎么使用
- 【UML】基本介绍与类图(依赖、泛化、实现、关联、聚合、组合关系)
- REUSE_ALV_FIELDCATALOG_MERGE函数
- JavaScript小案例-阶乘!
- libuv工作队列
- SSL_ERROR_WANT_READ