[TK] 理想的正方形
1.[TK] 矩阵取数游戏<简单版> hzoi-tg-906-22.[TK] 一心净士 hzoj-tg-937-23.[TK] 盖房子 hzoi-tg#2624.[TK] 三角蛋糕 hzoi-tg#2615.[TK] 选课 hzoj-tg#2796.[TK] 三色二叉树 hzoi-tg#282 存图方法7.[TK] HH的项链 离线树状数组解法
8.[TK] 理想的正方形
9.[TK] Blocks 单调栈10.[TK] 送礼物11.[TK] Terrible Prime12.[TK] BLO13.[TK] Rudolf and Subway ( CodeForces #933 div.3 - G )14.[TK] Bulls And Cows S15.[TK] 颜色16.[Tkey] 与非17.[TK] CF1526B I Hate 111118.[TK] 寻宝游戏19.[CL-22] 异或和之和20.联训题单 / 集训杂题纪要21.[At_dp_w] Intervals & [At_dp_x] Tower22.CF2023D - Many Games23.[NOI2021] 轻重边24.[CSP-S 2024] 染色题目描述
有一个整数组成的矩阵,现请你从中找出一个指定边长的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
题目分析
其实这道题和滑动窗口很像,而滑动窗口使用优先队列解决.
我们都知道优先队列可以维护区间最值. 但是优先队列维护的区间不是二维的,而是一维的.
因此,这道题我们的思考方向,一是把优先队列拓展到二维,二是用一维优先队列解决问题.
思考一下怎么用一维优先队列解决问题,我们可以发现,一个区间内的最大值等于各行最大值的最大值,最小值等于各行最小值的最小值. 这启发我们采用先一维再一维的方式解决问题.
因此,我们需要做的是,跑出每行滑动窗口的最值,再跑出相同列滑动窗口最值的最值,在所有最值中选择最优解
代码实现
注: 使用了 封装滑动窗口
MMMW m[1001];
MMMW om[2][1001];
int a,b,n,ans=0x7fffffff;
int main(){
cin>>a>>b>>n;
for(int i=1;i<=a;++i){
for(int j=1;j<=b;++j){
cin>>m[i].a[j];
}
for(int j=1;j<=n-1;++j){
m[i].push(j);
}
for(int j=n;j<=b;++j){
m[i].out(j-n);
m[i].push(j);
om[0][j].a[i]=m[i].max();
om[1][j].a[i]=m[i].min();
}
}
for(int i=n;i<=b;++i){
for(int j=1;j<=n-1;++j){
om[0][i].push(j);
om[1][i].push(j);
}
for(int j=n;j<=a;++j){
om[0][i].out(j-n);
om[0][i].push(j);
om[1][i].out(j-n);
om[1][i].push(j);
ans=min(ans,om[0][i].max()-om[1][i].min());
}
}
cout<<ans;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!