寒假Day1:莫队算法+暴力分块

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 查看本文章

曼哈顿距离:

切比雪夫距离:

 

猜你喜欢

转载自www.cnblogs.com/OFSHK/p/12181516.html