当前位置: 首页 > ds >正文

loj数列分块入门2-3

loj数列分块入门2-3

(底下有视频讲解bilibili,会自动播放)

  • 本文和数列分块入门1 不同之处在于多了查找区间内小于某个数的最大值或者个数,区间加法的优化需要add数组来存储每段都加上的数字(类似于lzay标记)

上一期blog:loj6277数列分块入门1

这里是引用
在这里插入图片描述在这里插入图片描述

先给出视频讲解,两题非常相似,一起讲了

数列分块入门2-3

6278. 数列分块入门 2

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=50005;
int n,a[N],b[N],k,len,L[N],R[N],F[N],add[N];void Build()
{for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];len=sqrt(n),k=(n+len-1)/len;for(int i=1;i<=k;i++){L[i]=(i-1)*len+1;R[i]=min(i*len,n);sort(b+L[i],b+R[i]+1);F[L[i]]=i;}for(int i=1;i<=n;i++)if(F[i]==0 && i<=R[k])F[i]=(i-1)/len+1;
}
void Add(int l,int r,int c)
{int st=F[l],ed=F[r];if(st==ed){for(int i=l;i<=r;i++) a[i]+=c;for(int i=L[st];i<=R[st];i++) b[i]=a[i];sort(b+L[st],b+R[st]+1);}else{for(int i=l;i<=R[st];i++) a[i]+=c;for(int i=L[st];i<=R[st];i++) b[i]=a[i];sort(b+L[st],b+R[st]+1);for(int i=st+1;i<ed;i++) add[i]+=c;for(int i=L[ed];i<=r;i++) a[i]+=c;for(int i=L[ed];i<=R[ed];i++) b[i]=a[i];sort(b+L[ed],b+R[ed]+1);}
}int Ask(int l,int r,int c)
{int st=F[l],ed=F[r];int ans=0;if(st==ed){for(int i=l;i<=r;i++) ans+=(c > (a[i] + add[st]));}else{for(int i=l;i<=R[st];i++) ans+=(c > (a[i] + add[st]));for(int i=st+1;i<ed;i++)ans+=lower_bound(b+L[i],b+R[i]+1,c-add[i])-b-L[i];for(int i=L[ed];i<=r;i++) ans+=(c > (a[i] + add[ed]));}return ans;
}int main()
{scanf("%d",&n);Build();for(int i=1,opt,l,r,c;i<=n;i++){scanf("%d %d %d %d",&opt,&l,&r,&c);if(!opt) Add(l,r,c);else printf("%d\n",Ask(l,r,c*c));}return 0;
}

6279. 数列分块入门 3

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100005;
int n,a[N],b[N],k,len,L[N],R[N],F[N],add[N];
void Build()
{for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];len=sqrt(n),k=(n+len-1)/len;for(int i = 1; i <= k; i++){L[i]=(i-1)*len+1;R[i]=min(i*len,n);sort(b+L[i],b+R[i]+1);}for(int i=1;i<=n;i++)F[i]=(i-1)/len+1;
}
void Add(int l,int r,int c)
{if(F[l]==F[r]){for(int i=l;i<=r;i++) a[i]+=c;for(int i=L[F[l]];i<=R[F[l]];i++) b[i]=a[i];sort(b+L[F[l]],b+R[F[l]]+1);return;}int st=F[l],ed=F[r];for(int i=l;i<=R[st];i++) a[i]+=c;for(int i=L[st];i<=R[st];i++) b[i]=a[i];sort(b+L[st],b+R[st]+1);for(int i=st+1;i<ed;i++) add[i]+=c;for(int i=L[ed];i<=r;i++) a[i]+=c;for(int i=L[ed];i<=R[ed];i++) b[i]=a[i];sort(b+L[ed],b+R[ed]+1);
}
int Ask(int l,int r,int c)
{int ans=-1;int st=F[l],ed=F[r];if(st==ed){for(int i=l;i<=r;i++){int val=a[i]+add[st];if(val<c) ans=max(ans,val);}return ans;}for(int i=l;i<=R[st];i++){int val=a[i]+add[st];if(val<c) ans=max(ans,val);}for(int i=st+1;i<ed;i++) {int x=c-add[i];int pos=lower_bound(b+L[i],b+R[i]+1,x)-b-1;if(pos>=L[i]-1){int val=b[pos]+add[i];if(val<c) ans=max(ans,val);}}for(int i=L[ed];i<=r;i++){int val=a[i]+add[ed];if(val<c) ans=max(ans,val);}return ans;
}int main()
{scanf("%d",&n);Build();for(int i=1,opt,l,r,c;i<=n;i++){scanf("%d %d %d %d",&opt,&l,&r,&c);if(!opt) Add(l,r,c);else printf("%d\n",Ask(l,r,c));}return 0;
}
http://www.xdnf.cn/news/18787.html

相关文章:

  • c++string
  • crypto.randomUUID is not a function
  • 拓扑排序|hash
  • frp+go-mmproxy 实现透明代理的内网穿透
  • Qt5 高级功能
  • 关于说明锂电池充电芯片实际应用
  • 曲面方程的三维可视化:从数学解析到Python实现
  • 从罗永浩访谈李想中学习现代家庭教育智慧
  • 定时器互补PWM输出和死区
  • 54.Redis持久化-AOF
  • JEI(Journal of Electronic lmaging)SCI四区期刊
  • 控制建模matlab练习16:线性状态反馈控制器-⑤轨迹追踪
  • Linux内核进程管理子系统有什么第三十三回 —— 进程主结构详解(29)
  • 【KO】前端面试四
  • Java八股文-java基础面试题
  • 9.Shell脚本修炼手册---数值计算实践
  • 使用tensorRT10部署yolov5目标检测模型(2)
  • UE5.3 中键盘按键和操作绑定
  • 青少年机器人技术(六级)等级考试试卷-实操题(2021年12月)
  • 深入理解3x3矩阵
  • 11.Shell脚本修炼手册---IF 条件语句的知识与实践
  • 【数据结构】布隆过滤器的概率模型详解及其 C 代码实现
  • mysql没有mvcc之前遇到了什么问题
  • 2025年AI Agent规模化落地:企业级市场年增超60%,重构商业作业流程新路径
  • Hive中的join优化
  • 基于SpringBoot的招聘系统源码
  • 解决Conda访问官方仓库失败:切换国内镜像源的详细教程
  • STAR-CCM+|K-epsilon湍流模型溯源
  • GEO优化供应商:AI搜索时代的“答案”构建与移山科技的引领,2025高性价比实战指南
  • 基于大模型的对话式推荐系统技术架构设计