题目

https://www.luogu.com.cn/problem/P3933

顺便:中国珂学院

思路

看到此题先大喊一声“我永远喜欢珂朵莉!”

好了然后我们思考一下如何做此题。

我们跳转到问题:现在要问,所有合法的分法中,A区域的极差与B区域的极差 中间较大的一个的最小值是多少?

关键字提取,我们比较容易想到这题大概率是一个二分题,就是求一个最小的\(d\)值使得两部分的极差都\(\leq d\)。

然后我们来看对于某一个\(d\)怎么判定它合不合法。

AAAAA  AAAAA  AAAAA
AABAA  BAAAA  AAABB
ABBBA  BBAAA  AAABB
AABAA  BAAAA  ABBBB
AAAAA  AAAAA  BBBBB
(1) (2) (3)

观察一下切割的规则,发现实际上就是要求每一行\(中A\)的数量单调递减。当然这个结论其实是假的,因为

BBBBA     ABBBB
BBBAA AABBB
BAAAA AABBB
BAAAA AAABB
AAAAA AAAAB

这些东西也是合法的。

但是可以注意到这些图形通过顺时针旋转\(90°,180°,270°\) 总可以变换到上述的情况。

于是我可以只考虑每行的A单调递减的情况。

那么判定方法也呼之欲出了,我们依次查看每一行,从左往右能分到A就分A,不能就跳到下一行,然后每一行A的上限是上一行A的个数,YY一下可知这种贪心策略是正确的。

这样A的部分就处理完了,然后判一下B的部分极差是否满足就可以了。

保证极差小于d,可以维护一个max和min。

这个题是我高二时联赛前模拟赛的一道题,当时完全没有思路,作为珂学家实在是很丢人qwq。

代码

点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int a[4][2001][2001];
int check(int k,int n,int m,int d){
int i,j,L;
int last[2001],mx=0,mn=inf;
memset(last,0,sizeof(last));
last[0]=m;
for(i=1;i<=n;++i){
for(j=1;j<=last[i-1];++j){
if(max(mx,a[k][i][j])-min(mn,a[k][i][j])<=d)
mx=max(mx,a[k][i][j]),mn=min(mn,a[k][i][j]);
else
break;
}
last[i]=j-1;
if(!last[i]) break;
}
mn=inf,mx=0;
for(i=n;i>=1;--i){
for(j=last[i]+1;j<=m;++j){
if(max(mx,a[k][i][j])-min(mn,a[k][i][j])<=d)
mx=max(mx,a[k][i][j]),mn=min(mn,a[k][i][j]);
else
return 0;
}
if(last[i]==m) return 1;
}
return 1;
}
int main(){
int i,j,n,m,N;
int ans=inf;
int mx=0,mn=inf;
scanf("%d%d",&n,&m);
N=max(n,m);
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
scanf("%d",&a[0][i][j]);
a[1][m-j+1][i]=a[0][i][j];
a[2][n-i+1][m-j+1]=a[0][i][j];
a[3][j][n-i+1]=a[0][i][j];
mx=max(mx,a[0][i][j]);
mn=min(mn,a[0][i][j]);
}
}
int L=0,R=mx-mn;
while(L<=R){
int mid=L+R>>1;
int flag=0;
flag|=check(0,n,m,mid);
flag|=check(1,m,n,mid);
flag|=check(2,n,m,mid);
flag|=check(3,m,n,mid);
if(flag) ans=min(ans,mid),R=mid-1;
else L=mid+1;
}
printf("%d",ans);
// system("pause");
return 0;
}

洛谷P3933 Chtholly Nota Seniorious的更多相关文章

  1. 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】

    威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...

  2. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

  3. 【Luogu】P3933 Chtholly Nota Seniorious

    [题意]将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小.n,m<=2000 [算法]二分 [题解]极差的数值满足单调性,所以考虑二分极差. 对于给定的极差,将所有数值排序 ...

  4. Chtholly Nota Seniorious

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...

  5. noip模拟赛 Chtholly Nota Seniorious

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...

  6. 洛谷 P4171 [JSOI]满汉全席

    洛谷 最近刚刚学的2-sat,就刷了这道裸题. 2-sat问题一般是用tarjan求的,当出现(x,y)或(!x,y)或(x,!y)三种选择时,我们可以把!x->y,!y->x连边. 然后 ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  10. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. 知识分享-消息中间件详解+rabbitMQ

    知识分享-消息中间件详解+rabbitMQ 消息中间件 概述 消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步.可靠的消息传输的支撑性软件系统. 应用场景 异步处理 对于电商a ...

  2. css实习滤镜效果(背景图模糊)

    模糊实例 图片使用高斯模糊效果: img { -webkit-filter: blur(5px); /* Chrome, Safari, Opera */ filter: blur(5px); } c ...

  3. C语言两结构体之间的成员互换

    今天在写一个通讯录实现程序的时候,遇到个让我突然卡壳的问题,不知道怎么进行两个结构体之间的成员互换......结构体成员有"姓名","性别","年龄& ...

  4. Linux安装&卸载mysql5.7

    Linux系统下卸载mysql 停止mysql服务 systemctl stop mysqld.service 查看安装的mysql服务 rpm -qa|grep -i mysql 删除安装的mysq ...

  5. Excelize 2.7.0 发布, 2023 年首个更新

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...

  6. SSM框架——MyBatis

    Mybatis 1.Mybatis的使用 1.1给项目导入相关依赖 我这里有几个下载好的依赖包提供给大家 点我下载--junit4.13.2 点我下载--maven3.8.1 点我下载--mybati ...

  7. 《深度探索C++对象模型》第六章 执行期语意学

    new运算符和delete运算符 运算符new看似是一个简单的运算,比如: int *pi=new int(5); 但是它实际由两个步骤完成: 1.通过适当的new运算符函数实体,配置所需的内存: / ...

  8. 03-逻辑综合工具 - Design Compiler

    逻辑综合工具DC IC设计流程,市场-->制定spec-->RTL(同时进行sim,通过alint检查RTL有没有错误)-->systhesis(逻辑综合)-->PR(STA) ...

  9. (原创)【B4A】一步一步入门01:简介、开发环境搭建、HelloWorld

    一.前言 作者注:絮絮叨叨,可跳过不看. 一直有开发跨平台软件的需求.因为我的主力是C# ,所以当MAUI出现后,我欣喜若狂的开始学习研究.但是经历了两个月左右的时间,我弃坑了,我发现MAUI不是我能 ...

  10. Unity打包资源,进行后台加载

    Unity打包资源,进行后台加载 需要项目优化的pa you,这边走:Unity项目优化--Web版 一.前言 因为在下载Three.js,所以趁着这个时间写一下资源打包加载吧 小黑在刚开始学习Uni ...