HELLO WORL|

kingwzun

园龄:3年6个月粉丝:111关注:0

分块和莫队算法

分块

理解

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 中国大陆许可协议进行许可。

posted @   kingwzun  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起