洛谷P3933 Chtholly Nota Seniorious
题目
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的更多相关文章
- 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】
威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...
- 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心
题目链接 题意 给你一个N*M的矩阵 (N,M <=2000) 把他分成两部分 使两部分的极差较大的一个最小 求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...
- 【Luogu】P3933 Chtholly Nota Seniorious
[题意]将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小.n,m<=2000 [算法]二分 [题解]极差的数值满足单调性,所以考虑二分极差. 对于给定的极差,将所有数值排序 ...
- Chtholly Nota Seniorious
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...
- noip模拟赛 Chtholly Nota Seniorious
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg こんなにも.たくさんの幸せをあの人に分けてもらった だから.きっと 今の.私は 谁が何と ...
- 洛谷 P4171 [JSOI]满汉全席
洛谷 最近刚刚学的2-sat,就刷了这道裸题. 2-sat问题一般是用tarjan求的,当出现(x,y)或(!x,y)或(x,!y)三种选择时,我们可以把!x->y,!y->x连边. 然后 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)
所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山....,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang ...
- 【转载】EXCEL VBA 同时选择多个工作表的方法
如果要用VBA同时选择多个工作表,可以利用数组或设置"Select"方法的参数为"False"来扩展所选择的内容,如下面的一些代码: 1.用工作表名称: ...
- vue3学习第一天
第一章 Options API与Composition API 重写双向绑定 vue2 基于Object.defineProperty()实现 vue3 基于Proxy proxy与Object.de ...
- 05.深入理解JMM和Happens-Before
大家好,我是王有志. JMM都问啥? 最近沉迷P5R,所以写作的进度很不理想,但不得不说高卷杏YYDS.话不多说,开始今天的主题,JMM和Happens-Before. 关于它们的问题并不多,基本上只 ...
- Gvim基础操作-01
Gvim基础操作 进行代码或者是文本.脚本都要使用到文本编辑工具. vi是visual的缩写,其意为可视化.它是Unix系统文本编辑的标准工具.利用光标在屏幕上的移动,用户可以方便的建立.修改或者插入 ...
- CF1779C Least Prefix Sum 题解
CF链接:Least Prefix Sum Luogu链接:Least Prefix Sum $ {\scr \color {CornflowerBlue}{\text{Solution}}} $ 先 ...
- day14-JdbcTemplate-01
JdbcTemplate-01 看一个实际需求: 如果希望使用spring框架做项目,Spring框架如何处理对数据库的操作呢? 方案一:使用之前的JdbcUtils类 方案二:spring提供了一个 ...
- 基于View接口
目录 基于View接口 1.写模型表以及数据库迁移 3.使用CBV写查询所有的视图接口 4.配路由 基于View接口 Django原生即继承View来实现写接口,的确过程很繁杂,很多东西都是手动写 ...
- 在windows系统下用vscode构造shell脚本IDE
1.基础环境搭建 安装Visual Studio Code(VScode ) 下载地址:https://code.visualstudio.com/Download 下载完双击文件,选择路径安装即可, ...
- Python源文件的编码
Python源文件的编码 入门教程->2.2.1 源文件的字符编码 参考官网:https://docs.python.org/zh-cn/3.9/tutorial/interpreter.htm ...