TO DO LIST:
- 暴力分块
- 莫队算法
- W 50+
暴力分块:
可以看一下 洛谷P1816 忠诚 https://www.luogu.com.cn/problem/P1816
题解:https://www.luogu.com.cn/problemnew/solution/P1816?page=2
查询给定区间内的最小值
先看一下暴力分块的相关知识再去看莫队
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<cmath>
#include<iostream>
using namespace std;
#define inf 0x3f3f3f3f
const int N=1e5+20;
int block;
int a[N],belong[N],minn[N];
int query(int x,int y)
{
int m=inf;
for(int i=x;i<=min(belong[x]*block,y);i++)
m=min(a[i],m);
if(belong[x]!=belong[y])
{
for(int i=(belong[y]-1)*block+1;i<=y;i++)
m=min(m,a[i]);
}
for(int i=belong[x]+1;i<=belong[y]-1;i++)
m=min(m,minn[i]);
return m;
}
int main()
{
int n,k,aa,bb;
scanf("%d %d",&n,&k);
block=sqrt(n);
memset(minn,inf,sizeof(minn));//注意清inf
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
belong[i]=(i-1)/block+1;
minn[belong[i]]=min(minn[belong[i]],a[i]);
//minn中记录的最小值是相对于每一块而言的,不是每一个下标
//用每一块的最小值和当前值进行比较取最小值
}
for(int i=1;i<=k;i++)
{
scanf("%d %d",&aa,&bb);
int w=query(aa,bb);
if(i==k)
printf("%d\n",w);
else
printf("%d ",w);
}
return 0;
}
莫队算法:
欧式距离:就是勾股定理
扫描二维码关注公众号,回复:
8530251 查看本文章
曼哈顿距离:
切比雪夫距离: