[NOIP2018校模拟赛]T2矩阵分组 Matrix
题目链接:###
分析:###
这道题求的是两部分极差当中大的那个的最小值。对于这种求最值的问题,我们很自然(其实并没有)地想到二分答案。
这个题有两个结论:
(好像当时看出来了第一个?然后发现下面都不会了,果断弃疗滚去写T3)
第一个结论:###
对于划分的每个区域,为了保证只拐一次弯,它每一行的长度是单调且连续的
这样任意两个元素之间拐个直角弯就能到了(x)
参见下图(从发的solution里面扒的):

这个结论可以感性得到(……),因为如果它每一行的长度不单调,就会有 凸 ←这种形状的东西出来,从它的一边到另外一边肯定是要拐至少两个弯的
第二个结论:###
矩阵A和矩阵B可以互换(即它们是等价的)
因为每个矩阵不管怎么讲总要占据一个角落(否则不满足结论1),所以先考虑A占据左上角的情况,然后把它旋转三次就能涵盖到所有情况。
二分一个值mid(mid=min(max(gmaxi1-gmini1,gmaxi2,gmini2)),其上界为矩阵中最大值-最小值,下界为0,这样最后的mid就是答案
对于check函数的思路:###
因为矩阵中最大值和最小值不能在一个区域,否则这个max(gmaxi1-gmini1,gmaxi2,gmini2)就会很大,所以我们不妨设tot_max在A区域
从第一行开始找到第一个(找第一个是为了保证单调)与tot_max差值大于mid的值,这时候就跳出循环(这里每一行的枚举不能超过上一行的边界),后面同理,处理出矩阵A,显然这个矩阵A一定是满足条件的
然后我们验证剩下的部分(即矩阵B)当中的极差是否小于等于mid即可
代码:###
#include<bits/stdc++.h>
using namespace std;
int n,m,x=1,x1=1,x2=n,x3=m,y=1,yy=n,y2=m,y3=1,t;
int tot_max=-(1<<20),tot_min=1<<20;
int a[4][2005][2005],endi[2005]; //endi中存储A矩阵每行的边界
inline int read(){
int cnt=0,f=1;char c;
c=getchar();
while(!isdigit(c)){
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c)){
cnt=cnt*10+c-'0';
c=getchar();
}
return cnt*f;
}
bool check(int kind,int x){
if(kind&1) swap(n,m); // 这里第二和第四个矩阵是分别顺时针逆时针旋转了90°的,所以行数和列数需要交换
endi[0]=m;
int tag;
for(register int i=1,j;i<=n;i++){
for(j=1;j<=endi[i-1];j++){
if(tot_max-a[kind][i][j]>x) //找到第一个与tot_max差值小于等于mid的值
break;
}
endi[i]=j-1;
}
for(register int i=1;i<=n;i++)
for(register int j=endi[i]+1;j<=m;j++) //处理第二个矩阵
if(a[kind][i][j]-tot_min>x){
if(kind&1) swap(n,m); //如果刚刚交换了n和m,为了下次check,这里需要换回来
return false;
}
if(kind&1) swap(n,m);
return true;
}
bool tot_check(int x){
if(check(0,x))return true;
if(check(1,x))return true;
if(check(2,x))return true;
if(check(3,x))return true;
return false;
}
int main(){
n=read();m=read();
x=1,x1=1,x2=n,x3=m,y=1,yy=n,y2=m,y3=1;
for(register int i=1;i<=n;i++){ //读入矩阵,读入的时候就可以顺手旋转成四个矩阵了(顺便这个旋转很巧妙啊)
for(register int j=1;j<=m;j++){
t=a[0][x][y++]=a[1][x1++][yy]=a[2][x2][y2--]=a[3][x3--][y3]=read();
if(t>tot_max)tot_max=t;
if(t<tot_min)tot_min=t;
}
x++,y=1,yy--,x1=1,x2--,y2=m,y3++,x3=m;
}
int l=0,r=tot_max-tot_min;
int mid=(l+r)>>1;
while(l<r){
if(tot_check(mid)){
r=mid;
mid=(l+r)>>1;
}
else{
l=mid+1;
mid=(l+r)>>1;
}
}
printf("%d",mid);
return 0;
}
[NOIP2018校模拟赛]T2矩阵分组 Matrix的更多相关文章
- [NOIP2018校模拟赛]T1 阶乘
题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...
- [NOIP2018校模拟赛]T1聚会 party
题目链接: 聚会 分析: 设每个点到1号点的距离为dist_{i},每个点的权值为x_{i},目标点到1号点的距离为dist,权值为x,那么对于每一次查询,我们讨论三种情况: ① 目标家庭在区间左边( ...
- 模拟赛T2 交换 解题报告
模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...
- NOI.AC: NOIP2018 全国模拟赛习题练习
闲谈: 最后一个星期还是不浪了,做一下模拟赛(还是有点小虚) #30.candy 题目: 有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi 给出n ...
- Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵
螺旋矩阵 题目 问题描述 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵. 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 ...
- 五校联考模拟赛Day2T2矩阵(容斥原理)
题意 $n * m$的网格,对其进行黑白染色,问每一行每一列至少有一个黑格子的方案数. Sol 考场上只会$n^3$的dp,还和指数级枚举一个分qwq 设$f[i][j]$表示到了第$i$行,已经有$ ...
- NOIP欢乐模拟赛 T2 解题报告
小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...
- 5.12 省选模拟赛 T2 贪心 dp 搜索 差分
LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...
- 20161003 NOIP 模拟赛 T2 解题报告
Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...
随机推荐
- spring中Bean创建
Spring中bean的加载过程: 1.获取配置文件资源 2.对获取的xml资源进行一定的处理检验 3.处理包装资源 4.解析处理包装过后的资源 5.加载提取bean并注册(添加到beanDefini ...
- netty5源代码探索(一)----ByteBuf初探
Netty的各种简单介绍,总体架构就不介绍了,假设大家感觉的确须要,给我留言我再追加. 这里再推广一个自己做得netty+spring的集成方案,优化netty配置启动,并提供基础server搭建的配 ...
- 利用BADI WORKORDER_INFOSYSTEM在COOIS中加入自己定义列办事处
需求描写叙述:依据LC业务部门提出的需求.须要在COOIS中加入办事处一列. 1.在IOHEADER_TAB的CI_IOHEADER中加入字段办事处.如以下图所看到的: watermark/2/t ...
- Axure Base 08 动态面板的用途
写了几个Axure教程之后发现,可能教程的起点有些高了,过分的去讲效果的实现,而忽略了axure功能以及基础元件的使用,那么从这个教程开始,把这些逐渐的展开讲解. 关于动态面板 动态面板是axure原 ...
- TGraphiControl响应WM_MOUSEMOVE的过程(以TPaintBox为例)good
起因:非Windows句柄控件也可以处理鼠标消息,我想知道是怎么处理的:并且想知道处理消息的顺序(比如TPaintBox和TForm都响应WM_Mouse消息该怎么办)界面:把TPaintBox放到T ...
- mysql 发生系统错误1067
一般是由配置文件错误语法不正确引起的,如my.ini本人在mysql mysql-5.6.29-winx64 配置过程中遇到“发生系统错误1067”主要由于下面两个目录写的格式不正确引起的正确写法如下 ...
- Centos6.8更好yum源
第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...
- YTU 2392: 求各位数字之和
2392: 求各位数字之和 时间限制: 1 Sec 内存限制: 128 MB 提交: 1253 解决: 292 题目描述 编写一个程序,计算任意输入的正整数的各位数字之和.(输入的位数不要超过10 ...
- Caused by: java.lang.IllegalArgumentException: Malformed \uxxxx encoding.
application.properties中不能含有\符号. 只要遇到就会报这个错误. 解决方式:将application.properties中的 \ 改为 \\ 或者 /
- Parameter 'username' not found. Available parameters are [1, 0, param1, param2]
只要把dao层的***Mapper.java代码的参数加上@param 才可以 修改前的代码 public User selectLogin(String username,String passwo ...