分块和莫队算法
分块
理解
n个元素分成根号n块,没块都有根号n个元素
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+7; int belong[maxn];//这个数在哪一块 int block;//每块大小 int num;//有多少块 int l[maxn];//块的左边 int r[maxn];//块的右边 int a[maxn]; int n; int q,Max[maxn]; void build() {fs block=sqrt(n);//每块大小 num=n/block;if(n%block) num++;//有多少块 for(int i=1;i<=num;i++) { l[i]=(i-1)*block+1;//每一块的左边界 r[i]=i*block;//每一块的右边界 } r[num]=n;//最后一块单独处理右边 for(int i=1;i<=n;i++) { belong[i]=(i-1)/block+1; } }
莫队算法
提示
只需要考虑Add和Sub函数,其他几乎就是模板
理解
代码
模板
#include <iostream> #include <string.h> #include <cmath> #include <algorithm>//排序用 using namespace std; const int maxn = 5e4+5; const int maxm = maxn; int a[maxn];//记录数据 int pos [maxn];//记录是数据是第几块 struct Q//记录询问 { int l,r,k; }q[maxn]; int res; int main(int argc,char const *argv[]) { //n m l r int n,m; cin>>n>>m; //分块 int siz = sqrt(n); int i; for(i=1;i<=n;i++) { cin>>a[i]; pos[i]=i/siz; } //查询 for(i=0;i<m;i++) { cin>>q[i].l>>q[i].r; q[i].k=i; } //排序 sort(q,q+m,[](Q x,Q y) { return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l]; }); //挪区间 int l=1,r=0;//[l,r]闭区间 for(i=0;i<m;i++) { while(q[i].l<l) Add(--l); while(q[i].r>r) Add(++r); while (q[i].l>l) Sub(l++); while(q[i].r<r) Sub[r--]; //记录答案 ans[q[i].k]=res; } for(i=0;i<m;i++) { cout<<ans[i]<<endl; } return 0; }
实战
P2709 小B的询问
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/15170815.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库