Atcoder 2444 - JOIOI 王国(二分)
记 \(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 王国(二分)的更多相关文章
- JOIOI王国 - 二分+贪心
题面 题解 通过一句经典的话"最大值的最小值" 我判断它是二分题, 不难发现,整个图形中两个省的分界线是一条单调不递减或单调不递增的折线. 而且,越到后来它的最大值只会越来越大,最 ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 【2018.9.20】JOI 2017 Final T3「JOIOI 王国 / The Kingdom of JOIOI」
题目链接 题目描述 JOIOI 王国是一个 $H$ 行 $W$ 列的长方形网格,每个 $1\times 1$ 的子网格都是一个正方形的小区块.为了提高管理效率,我们决定把整个国家划分成两个省 $JOI ...
- Atcoder D - Widespread (二分)
题目链接:http://abc063.contest.atcoder.jp/tasks/arc075_b 题解:直接二分答案然后再判断(a-b)来替代不足的.看代码比较好理解,水题. #include ...
- AtCoder AGC032E Modulo Pairing (二分、贪心与结论)
题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以 ...
- 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 ...
- loj#2334 「JOI 2017 Final」JOIOI 王国
分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...
- The Accomodation of Students HDU - 2444(判断二分图 + 二分匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
随机推荐
- FastAPI 学习之路(四十六)WebSockets(二)
上一篇文章,我们分享了WebSockets一些入门的,我们这节课,在原来的基础上,对于讲解的进行一个演示.我们最后分享了依赖token等.首先我们对上次的代码进行调整. 我们之前分享FastAPI 学 ...
- 什么是Sprint计划?
Sprint 计划是Scrum框架中的一个事件,团队将确定他们将在冲刺期间处理的产品积压项目,并讨论他们完成这些产品积压项目的初始计划. 团队可能会发现建立冲刺目标很有帮助,并以此为基础确定他们在冲刺 ...
- 小白学习C语言必背的18个经典程序
1./*输出9*9口诀.共9行9列,i控制行,j控制列.*/ #include "stdio.h" main() {int i,j,result; for (i=1;i<10 ...
- Java并发:重入锁 ReentrantLock(一)
ReentrantLock 是一种可重入的互斥锁,它不像 synchronized关键字一样支持隐式的重进入,但能够使一个线程(不同的方法)重复对资源的重复加锁而不受阻塞. ReentrantLock ...
- DH密钥交换
DH密钥交换 密模运算 所谓幂模,就是先做一次幂运算,再做一次模运算. 模运算有以下性质: 也就是说,先模再乘和先乘再模,只要最后都模了同一个模数,结果都是一样. 有了这个性质,我们首先得到幂模运算的 ...
- VirtualBox Share Folder
转载:https://www.cnblogs.com/Dennis-mi/articles/5896586.html 使用virtualbox最方便的host-guest交换文件方案莫过于共享文件夹功 ...
- PCIe知识摘要记录
摘: 一. 在PCIe的Spec中,并没有特别详细的关于Root Complex的定义,从实际的角度来讲,可以把Root Complex理解为CPU与PCIe总线系统通信的媒介.Endpoint处于P ...
- Atcoder 题目泛做
我思维越来越菜了,这样下去感觉要退役了. 听说Atcoder的题练思维?那就试着做一做吧. 坚持每天一两道吧.(很有可能咕掉.) AGC036 官方题解 ---A-Triangle ...
- uni-app(Vue)中(picker)用联动(关联)选择以至于完成某些功能
如下图所示,在项目中需求是通过首先选择学生的专业,选好之后在每个专业下面选择对应的学期,每个学期有对应的学费,因此就需要联动选择来实现这一功能. 以下仅展示此功能主要代码: <div class ...
- 关于Asp.net core配置信息读取的源码分析梳理
概述 我们都知道asp.net core配置信息的读取离不开IConfigurationSource和IConfigurationProvider这两个类,ConfigurationSource可以提 ...