题面传送门

记 \(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. 脚本注入3(blind)

    布尔盲注适用于任何情况回显都不变的情况. (由此,可以看出,回显啥的其实都不重要,最重要的是判断注入点.只要找到注入点了,其他的都是浮云.) 在操作上,时间盲注还稍微简单一点:它不需要像布尔盲注那样, ...

  2. UltraSoft - Beta - Scrum Meeting 8

    Date: May 24th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 暂无 Kkkk 前端 暂无 王f ...

  3. Spring Cloud Alibaba 的服务注册与发现

    Spring Cloud Alibaba 服务发现例子 一.需求 1.提供者完成的功能 2.消费者完成的功能 3.可以附加的额外配置 二.实现步骤 1.总的依赖引入 2.服务提供者和发现者,引入服务发 ...

  4. 嵌入式物联网之SPI接口原理与配置

    本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...

  5. 攻防世界 杂项14.Erik-Baleog-and-Olaf

    下载解压后用notepad++打开 发现是一个PNG的图片文件,该后缀,再用Stegsolve打开看一下, 发现一个残缺二维码,果断在线PS补全 扫码得到flag flag{#justdiffit}

  6. stat命令的实现

    任务详情 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate.c,提交码云链接 测试代码,mystat 与st ...

  7. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...

  8. Codeforces Round #747 (Div. 2)题解

    谢天谢地,还好没掉分,还加了8分,(8分再小也是加啊)前期刚开始有点卡,不过在尽力的调整状态之后,还是顺利的将前面的水题过完了,剩下的E2和F题就过不去了,估计是能力问题,自己还是得认真补题啦. E2 ...

  9. 一次fork引发的惨案!

    "你还有什么要说的吗?没有的话我就要动手了",kill程序最后问道. 这一次,我没有再回答. 只见kill老哥手起刀落,我短暂的一生就这样结束了··· 我是一个网络程序,一直以来都 ...

  10. AndroidStudio中debug.keystore文件不存在解决办法

    Android项目丢失了debug.keystore,直接重新生存一个key. 在cmd下,进入C:\Users\Administrator\.android目录执行命令如下:  keytool -g ...