题面传送门

记 \(mxi\) 为 IOI 国海拔的最大值,\(mni\) 为 IOI 国海拔的最小值,\(mxj\) 为 JOI 国海拔的最大值,\(mnj\) 为 JOI 国海拔的最小值。

不难发现 \(mxi,mni,mxj,mnj\) 中有 2 个值已经确定下来了,\(\max(mxi,mxj)\) 一定等于矩阵的全局最大值 \(mx\),\(\min(mni,mnj)\) 一定等于矩阵的全局最小值 \(mn\)。

如果我们把海拔最高和最低的点分配到了同一个国家中,答案即为 \(mx-mn\)。

如果我们把海拔最高和最低的点分配到了不同的国家中,我们不妨假设海拔最高的点分配到了 JOI 国,海拔最低的点分配到了 IOI 国。

二分答案。

假设二分到 \(mid\),那么所有 IOI 国的城市的海拔 \(\leq mn+mid\),所有 JOI 国的城市的海拔 \(\geq mx-mid\)。

也就是所有海拔 \(>mn+mid\) 的城市全部属于 JOI 国,所有海拔 \(<mx-mid\) 的城市全部属于 IOI 国。

此时题目转化为:已知某些点属于 IOI 国,某些点属于 JOI 国,判断是否存在一种合法的分配方案。

根据题意两国的地形一定呈阶梯分部。所以可以分出四种情况,这里以 JOI 国占据左上角,IOI 国占据右下角为例。

考虑第 \(i\) 两国之间的分界线 \(b_i\),那么一定有 \(b_i \leq b_{i-1}\),而第 \(i\) 行 \(b_i\) 左边肯定都是 JOI 国的城市,第 \(i\) 行右边肯定都是 IOI 国的城市,根据这个你可以求出 \(b_i\) 的最大值和最小值,然后判断是否有交集即可。

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e3+5;
int n,m,a[MAXN][MAXN],mx=0,mn=0x3f3f3f3f;
int l[MAXN],r[MAXN];
bool check(int mid){
memset(l,0,sizeof(l));memset(r,0,sizeof(r));r[0]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]>mn+mid) l[i]=max(l[i],j);
for(int i=n;i;i--) l[i]=max(l[i],l[i+1]);
for(int i=1;i<=n;i++) r[i]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]<mx-mid) r[i]=min(r[i],j);
for(int i=1;i<=n;i++) r[i]=min(r[i-1],r[i]);
bool flg=1;for(int i=1;i<=n;i++) flg&=(l[i]<r[i]);if(flg) return 1;
memset(l,0,sizeof(l));memset(r,0,sizeof(r));r[n+1]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]>mn+mid) l[i]=max(l[i],j);
for(int i=1;i<=n;i++) l[i]=max(l[i],l[i-1]);
for(int i=1;i<=n;i++) r[i]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]<mx-mid) r[i]=min(r[i],j);
for(int i=n;i;i--) r[i]=min(r[i+1],r[i]);
flg=1;for(int i=1;i<=n;i++) flg&=(l[i]<r[i]);if(flg) return 1;
memset(l,0,sizeof(l));memset(r,0,sizeof(r));r[0]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]<mx-mid) l[i]=max(l[i],j);
for(int i=n;i;i--) l[i]=max(l[i],l[i+1]);
for(int i=1;i<=n;i++) r[i]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]>mn+mid) r[i]=min(r[i],j);
for(int i=1;i<=n;i++) r[i]=min(r[i-1],r[i]);
flg=1;for(int i=1;i<=n;i++) flg&=(l[i]<r[i]);if(flg) return 1;
memset(l,0,sizeof(l));memset(r,0,sizeof(r));r[n+1]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]<mx-mid) l[i]=max(l[i],j);
for(int i=1;i<=n;i++) l[i]=max(l[i],l[i-1]);
for(int i=1;i<=n;i++) r[i]=m+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]>mn+mid) r[i]=min(r[i],j);
for(int i=n;i;i--) r[i]=min(r[i+1],r[i]);
flg=1;for(int i=1;i<=n;i++) flg&=(l[i]<r[i]);if(flg) return 1;
return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mx=max(mx,a[i][j]),mn=min(mn,a[i][j]);
int l=0,r=mx-mn-1,ans=mx-mn;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
} printf("%d\n",ans);
return 0;
}

Atcoder 2444 - JOIOI 王国(二分)的更多相关文章

  1. JOIOI王国 - 二分+贪心

    题面 题解 通过一句经典的话"最大值的最小值" 我判断它是二分题, 不难发现,整个图形中两个省的分界线是一条单调不递减或单调不递增的折线. 而且,越到后来它的最大值只会越来越大,最 ...

  2. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  3. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  4. 【2018.9.20】JOI 2017 Final T3「JOIOI 王国 / The Kingdom of JOIOI」

    题目链接 题目描述 JOIOI 王国是一个 $H$ 行 $W$ 列的长方形网格,每个 $1\times 1$ 的子网格都是一个正方形的小区块.为了提高管理效率,我们决定把整个国家划分成两个省 $JOI ...

  5. Atcoder D - Widespread (二分)

    题目链接:http://abc063.contest.atcoder.jp/tasks/arc075_b 题解:直接二分答案然后再判断(a-b)来替代不足的.看代码比较好理解,水题. #include ...

  6. AtCoder AGC032E Modulo Pairing (二分、贪心与结论)

    题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以 ...

  7. AtCoder Regular Contest 092 Two Sequences AtCoder - 3943 (二进制+二分)

    Problem Statement You are given two integer sequences, each of length N: a1,…,aN and b1,…,bN. There ...

  8. loj#2334 「JOI 2017 Final」JOIOI 王国

    分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...

  9. The Accomodation of Students HDU - 2444(判断二分图 + 二分匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

随机推荐

  1. 关于ORBSLAM的发展脉络

    ORBSLAM系列存在随机性的原因:RANSAC中随机数生成器的使用:跟踪.映射和回环闭合线程的不可预测的交织,这取决于操作系统调度程序,这种不可预测性使得在不同的执行中估计的关键帧的姿势可能不同,甚 ...

  2. 占位符,SQL注入?

    这两天在上课时被同学拿了一段代码问我,这段代码有什么问题,我看了一会说:Connection和PreparedStatement都没关.他说不止这方面的问题,还有sql注入的问题,我就坚决的说使用了占 ...

  3. BUAA SE 软件案例分析-CSDN

    Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...

  4. Linux中检查字符串是否为合法IP地址的shell脚本

    #!/bin/bash #判断IP地址是否为有效IP CHKECK_IP () { CHECK_STEP1=`echo $1 | awk -F"." '{print NF}'` i ...

  5. VS2017+QT5.12.10+QGIS3.16环境搭建及开发全流程

    题记:大力发展生产力,助力高效采集.(转载请注明出处https://www.cnblogs.com/1024bytes/p/15477374.html) 本篇随笔分为五个部分: 一.获取QGIS3.1 ...

  6. 在Ubuntu下安装Solr

    使用wget命令去官网下载solr的压缩包. 1 wget https://mirrors.bfsu.edu.cn/apache/lucene/solr/8.6.3/solr-8.6.3.tgz 使用 ...

  7. JS控制文本框禁止输入特殊字符

    JS 控制不能输入特殊字符<input type="text" class="domain" onkeyup="this.value=this. ...

  8. linux下文件后面带~

    之前发现有时候在命令行ls会看到一些文件后面带有-,而这些文件的名字和我们文件夹中的某些文件是一模一样的文件,在文件夹中没发现就很大胆地删掉了也没是,一直没管,觉得是什么临时复制的文件或者隐藏文件.今 ...

  9. cf13C Sequence(DP)

    题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...

  10. JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

    public class Main { { //构造块(在构造对象时调用,先于构造方法执行) System.out.println("我是构造块!"); } static{ //静 ...