luogu3933 Chtholly Nota Seniorious(二分答案+贪心)

本文介绍了一种使用二分法解决特定矩阵问题的方法:如何使矩阵中最大值减最小值的结果尽可能小。通过设定不同旋转条件下的合法情况判断,实现了对最优解的有效搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题我哪会啊。。。让最大值最小,很显然的想到了二分答案。怎么解决是否合法呢?其实合法的情况,如果左上角为红色的话,就是每行的红色的个数是单调的即可。我们还贪心的想,应该让最大值和最小值不在一块内。因此我们假定最大值mx在红色块内,最小值mn在蓝色块内,这次二分判定的答案为x。假设红色块在左上角,则我们逐行贪心的选择尽量多的合法的(即>=mx-x的),这样留给蓝色的不合法情况一定不会更多。为了让分块合法,我们还得保证每行选取的红色个数是单调不增的。贪心的选取完红色,看蓝色是否满足即可。因为红色快还可能在右上角,左下角,左上角,因此我们要把棋盘旋转4次,每次都从左上角开始做即可。复杂度O(nmlog1e9)注意优化一下常数。。不然可能过不去。。比如提前把四种旋转的情况都处理出来。。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 2010
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,a[4][N][N],tmp[N][N],mx=0,mn=inf,now=0;
void rotate(int x,int y){
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            a[y][j][n-i+1]=a[x][i][j];
}
bool check(int x){
    int last=m;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=last;++j)
            if(a[now][i][j]<mx-x){last=j-1;break;}
        for(int j=last+1;j<=m;++j)
            if(a[now][i][j]>mn+x) return 0;
    }return 1;
}
bool jud(int x){
    if(check(x)) return 1;now++;now&=3;swap(n,m);
    if(check(x)) return 1;now++;now&=3;swap(n,m);
    if(check(x)) return 1;now++;now&=3;swap(n,m);
    if(check(x)) return 1;return 0;
}
int main(){
//  freopen("sample3.in","r",stdin);
    n=read();m=read();
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j) a[now][i][j]=read(),mx=max(mx,a[now][i][j]),mn=min(mn,a[now][i][j]);
    for(int i=1;i<=3;++i){
        rotate(now,now+1);now++;swap(n,m);
    }now=0;swap(n,m);
    int l=0,r=mx-mn;
    while(l<=r){
        int mid=l+r>>1;
        if(jud(mid)) r=mid-1;else l=mid+1;
    }printf("%d\n",r+1);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值