loj#2334 「JOI 2017 Final」JOIOI 王国

Posted yzxverygood

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了loj#2334 「JOI 2017 Final」JOIOI 王国相关的知识,希望对你有一定的参考价值。

分析

二分答案

判断左上角是否满足

为了覆盖所有范围

我们依次把右下角,左上角,右上角移动到左上角

代码

#include<bits/stdc++.h>
using namespace std;
int a[2010][2010],n,m,Ans=1e9+7,mx,mn=1e9+7;
inline bool ck(int x){
    int i,j,k,l=mn+x,r=mx-x,lim=m;
    for(i=1;i<=n;i++){
      for(j=1;j<=lim;j++)
        if(a[i][j]<r)break;
      lim=min(lim,j-1);
      for(j=lim+1;j<=m;j++)
        if(a[i][j]>l)return 0;
    }
    return 1;
}
inline void work(){
    if(ck(0)){
      puts("0");
      exit(0);
    }
    int le=0,ri=mx-mn;
    while(ri-le>1){
      int mid=(le+ri)>>1;
      if(ck(mid))ri=mid;
        else le=mid;
    }
    Ans=min(Ans,ri);
    return;
}
int main(){
    int i,j,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        scanf("%d",&a[i][j]),mn=min(mn,a[i][j]),mx=max(mx,a[i][j]);
    work();
    for(i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);
    work();
    for(i=1;i<=n;i++)reverse(a[i]+1,a[i]+m+1);
    work();
    for(i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);
    work();
    cout<<Ans;
    return 0;
}

 

以上是关于loj#2334 「JOI 2017 Final」JOIOI 王国的主要内容,如果未能解决你的问题,请参考以下文章

loj 3014「JOI 2019 Final」独特的城市

JOI 2020 Final 火灾

#3468. 「JOI 2021 Final」有趣的家庭菜园 4(双指针&差分)

2018.9.20JOI 2017 Final T2「準急電車 / Semiexpress」

2018.9.20JOI 2017 Final T3「JOIOI 王国 / The Kingdom of JOIOI」

「题解」:[loj2763][JOI2013]现代豪宅