题目链接:###

矩阵分组


分析:###

这道题求的是两部分极差当中大的那个的最小值。对于这种求最值的问题,我们很自然(其实并没有)地想到二分答案。

这个题有两个结论

(好像当时看出来了第一个?然后发现下面都不会了,果断弃疗滚去写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的更多相关文章

  1. [NOIP2018校模拟赛]T1 阶乘

    题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...

  2. [NOIP2018校模拟赛]T1聚会 party

    题目链接: 聚会 分析: 设每个点到1号点的距离为dist_{i},每个点的权值为x_{i},目标点到1号点的距离为dist,权值为x,那么对于每一次查询,我们讨论三种情况: ① 目标家庭在区间左边( ...

  3. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  4. NOI.AC: NOIP2018 全国模拟赛习题练习

    闲谈: 最后一个星期还是不浪了,做一下模拟赛(还是有点小虚) #30.candy 题目: 有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi 给出n ...

  5. Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵

    螺旋矩阵 题目 问题描述 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵. 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 ...

  6. 五校联考模拟赛Day2T2矩阵(容斥原理)

    题意 $n * m$的网格,对其进行黑白染色,问每一行每一列至少有一个黑格子的方案数. Sol 考场上只会$n^3$的dp,还和指数级枚举一个分qwq 设$f[i][j]$表示到了第$i$行,已经有$ ...

  7. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  8. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  9. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

随机推荐

  1. 使用virtualenv, uwsgi, nginx来布署flask

    本文讲述了怎样使用virtualenv, uwsgi, nginx来布署flask的步骤. 升级软件包 运行下面命令,保证你的机器安装了最新的软件包. sudo apt-get update sudo ...

  2. Ruby中任务构建工具rake的入门学习教程

    参考:http://www.jb51.net/article/81476.htm Rake简介 Rake的意思是Ruby Make,一个用ruby开发的代码构建工具. 但是,为什么Ruby需要Rake ...

  3. kbmMW 5.0.1发布了(跨全平台,包括Linux,可使用Win的高性能HTTPSys传输层,等等)

    kbmMW5如期发布,作者增加了很多重磅功能,以下翻译作者的发布文件:1.支持Delphi 10.2 Tokyo,包括Linux支持(测试版)2.大量的新功能与改进3.新的智能服务(Smart ser ...

  4. maven常用命令总结

    搞了多年java 似乎还有些命令 混混沌沌 今儿来总结下 mvn -v 查看版本 mvn -compile 编译当前工程 生成target目录的字节码文件以及报告 mvn -package 将当前工程 ...

  5. js 中call,apply,bind的区别

    call.apply.bind方法的共同点与区别: apply.call.bind 三者都是用来改变函数的this对象的指向: apply.call.bind 三者都可以利用后续参数传参: bind ...

  6. java.lang.IllegalArgumentException: No converter found for return value of type: class com.st.bean.User

    原因:springmvc默认是没有对象转换成json的转换器的,要添加jackson依赖 在pom.xml中添加 <dependency> <groupId>com.faste ...

  7. MySQL数据库设计常犯的错以及对性能的影响

    1.过分的反范式化为表建立太多的列 我们在设计数据库的结构时,比较容易犯的第一个错误就是对表进行了过分的反范式化的设计,这就容易造成了表中的列过多,虽然说Mysql允许为一个表建立很多的列,但是由于M ...

  8. codeforces 445B. DZY Loves Chemistry 解题报告

    题目链接:http://codeforces.com/problemset/problem/445/B 题目意思:给出 n 种chemicals,当中有 m 对可以发生反应.我们用danger来评估这 ...

  9. 蒟蒻的HNOI2017滚粗记

    蒟蒻的第一次省选,然而并没有RP爆发... Day 1: 8:00开考,(然而密码错误是什么鬼).跌跌撞撞,8:40终于拿到纸质试题. { T1:作为一名没有学过Splay的蒟蒻,考场上真的被出题人感 ...

  10. mediaplayer state

    enum media_player_states { MEDIA_PLAYER_STATE_ERROR = 0, MEDIA_PLAYER_IDLE = 1 << 0, MEDIA_PLA ...