题目大意:分块维护一个有 n 个数字的序列,有两种操作:区间加,区间查询小于某个数的元素个数。n <= 50000

预处理阶段:处理出块内元素的相对大小顺序(排序),时间复杂度为 \(O(nlogn)\)

查询阶段:区间加过程中每次重构的时间复杂度为 \(O(\sqrt n*log\sqrt n)\),查询过程中每次时间复杂度为 \(O(\sqrt n)\),一共 n 次操作。

因此,总时间复杂度为 \(O(n*logn+n*\sqrt n*log\sqrt n)\)

注:该题无法用树套树进行维护,树套树一般仅支持单点修改,平衡树区间修改操作会很慢。

分块比树套树优秀的地方在于维护的信息仅在块中处理即可,无需像树一样进行上传,即:无需考虑维护信息的区间合并性质。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
const int maxb=800; inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
} int n,m,a[maxn];
struct node{int l,r,add;}b[maxb];
int tot,bl[maxn];vector<int> v[maxb];
void make_block(){
tot=sqrt(n);
for(int i=1;i<=tot;i++)b[i].l=b[i-1].r+1,b[i].r=i*tot;
if(b[tot].r<n)++tot,b[tot].l=b[tot-1].r+1,b[tot].r=n;
for(int i=1;i<=tot;i++){
for(int j=b[i].l;j<=b[i].r;j++)bl[j]=i,v[i].push_back(a[j]);
sort(v[i].begin(),v[i].end());
}
}
inline void rebuild(int idx){
v[idx].clear();
for(int i=b[idx].l;i<=b[idx].r;i++)v[idx].push_back(a[i]);
sort(v[idx].begin(),v[idx].end());
}
void modify(int l,int r,int val){
int x=bl[l],y=bl[r];
if(x==y){
for(int i=l;i<=r;i++)a[i]+=val;
rebuild(x);
}else{
for(int i=x+1;i<=y-1;i++)b[i].add+=val;
for(int i=l;i<=b[x].r;i++)a[i]+=val;
for(int i=b[y].l;i<=r;i++)a[i]+=val;
rebuild(x),rebuild(y);
}
}
int query(int l,int r,int val){
int ans=0,x=bl[l],y=bl[r];
if(x==y){
for(int i=l;i<=r;i++)if(a[i]<val-b[x].add)++ans;
}else{
for(int i=x+1;i<=y-1;i++)ans+=lower_bound(v[i].begin(),v[i].end(),val-b[i].add)-v[i].begin();
for(int i=l;i<=b[x].r;i++)if(a[i]<val-b[x].add)++ans;
for(int i=b[y].l;i<=r;i++)if(a[i]<val-b[y].add)++ans;
}
return ans;
} int main(){
n=m=read();
for(int i=1;i<=n;i++)a[i]=read();
make_block();
while(m--){
int opt=read(),l=read(),r=read(),val=read();
if(opt==0)modify(l,r,val);
else if(opt==1)printf("%d\n",query(l,r,val*val));
}
return 0;
}

【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. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  5. #6278. 数列分块入门 2(询问区间内小于某个值 xx 的元素个数)

    题目链接:https://loj.ac/problem/6278 题目大意:中文题目 具体思路:数列分块模板题,对于更新的时候,我们通过一个辅助数组来进行,对于原始的数组,我们只是用来加减,然后这个辅 ...

  6. LOJ 6277-6280 数列分块入门 1-4

    数列分块是莫队分块的前置技能,练习一下 1.loj6277 给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 直接分块+tag即可 #include <bits/stdc++.h ...

  7. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

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

  8. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

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

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

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

  10. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

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

随机推荐

  1. JSP页面<%@ ...%>是什么意思?

    这表示是指令,主要用来提供整个JSP 网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式.语法.信息等.起始符号为: <%@终止符号为: %>目前有三种指令:page. ...

  2. YY:2018互联网创业公司应看清的事情

    潮流,技术,生活方式,盈利模式,消费人群几乎每年都在改变,2018,你看到的是怎样的一盘棋. 2018年是个很好的数字,很多互联网公司寄予希望在这个幸运数字年头奋起一搏,拿到一份可观的酬金.特别是一些 ...

  3. Linux下DNS服务(Bind9)之Web管理利器-NamedManager部署说明

    NamedManager 是一个基于Web的DNS管理系统,可用来添加.调整和删除DNS的zones/records数据.它使用Bind作为底层DNS服务,提供一个现代Ajax的Web界面,支持 IP ...

  4. Python-列表-9

    列表: Why: 我们现在已经学过的数据类型有:数字,布尔值,字符串,大家都知道数字主要用于计算,bool值主要是条件判断,只有字符串可以用于数据的存储,这些数据类型够用么?对于一门语言来说,肯定是不 ...

  5. Linux内核分析第二周:操作系统是如何工作的

    第一讲 函数调用堆栈 计算机是如何工作的? (总结)——三个法宝 1,存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 2,函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆 ...

  6. MyBatis中if,where,set标签

    <if>标签 <select id="findActiveBlogWithTitleLike" resultType="Blog"> S ...

  7. JDK学习AbstractQueuedSynchronizer和AbstractQueuedLongSynchronizer

    AbstractQueuedLongSynchronizer类是扩展自AbstractQueuedSynchronizer的,实现了java.io.Serializable接口. 其中提到的wait ...

  8. Linux技巧汇总

    Linux改变用户登录的Shell: usermod -s /bin/zsh 用户名 改变文件夹.文件的所属用户组和用户 chown root:root testfile

  9. Window安装Redis并设置为开机启动

    一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...

  10. spss入门

    spss下载地址:http://www.ddooo.com/softdown/53379.htm