首页 > 其他分享 >P2216 理想的正方形 题解

P2216 理想的正方形 题解

时间:2023-08-01 15:24:22浏览次数:43  
标签:题解 最大值 正方形 最小值 P2216 quemax 双端 quemin

P2216 理想的正方形

(为什么要写这篇题解?因为我β搞的心态炸了)

食用此题解所需:有基础的双端队列知识与一只可爱的 \(C++\)

传送门:起飞!

1. 思考

嗯,一看数据范围,\(a,b \leq 1,000\) ,就知道这道题一定是一道 \(\operatorname{O}(ab)\) 的题(因为输入就已经达到 \(100,000\) 级别了,就算是 \(\operatorname{O}(abn)\) 也过不去,顶多加一两个常数)

所以,\(\operatorname{O}(abn^2)\) 的暴力是过不去哒!

既然暴力过不去,那么 \(\dots\) 就换一个角度!

先单独考虑一个 \(n \cdot n\) 的正方形,我们可以把它切片,切成每一份为 \(1 \cdot n\) 的长方形,得出每一片长方形的最小值、最大值,然后再合并,也就是取最小、最大。

img

(图不严谨,只是稍微解释一下冲向的描述)

然后考虑横向的一排正方形,观察每个正方形最上面的一块切片,发现 \(\dots\) 没错,这就是一个 区间移动求最值 的过程,而区间的长度恰恰为 \(n\) 。

我们可以将最大值与最小值存下来,那么 \(dpmin_{i,j}\) 就表示第 \(i\) 行 \(j-n+1\) ~ \(j\) 这一条切片的最小值(最大值同理),显然,这玩意儿可以用双端队列优化。

img

接下来,考虑纵向转移:将一个正方形最右边的一列割出来,由于这一列每一个坐标对应的 \(dpmin\) 值都相当与一条长度为 \(n\) 的切片,所以这一列上的 \(n\) 个 \(dpmin\) 值的最小值就是这个正方形的最小值。观察正方形纵向移动,这一列的变化 \(\dots\) 也是 区间移动求最值 !(当然啦,最大值也是同理)

img

那么,在纵向求值后,每一个正方形的最大最小值就都求出来了。这道题,也就过了。

这样,我们只需一个 \(dpmin\) 数组,一个 \(dpmax\) 数组,一个存储输入数据的数组(可以优化成一维),和两个双端队列(重复使用,一个记最大值,一个记最小值),时间复杂度接近 \(\operatorname{O}(ab)\) (双端队列操作也要时间,但是比较快的)

2. 警钟敲烂!

  1. STL 使用前先判非空

  2. 两个双端队列代码差不多,但是千万别直接 Ctrl+C,Ctrl+V 然后改!容易混淆或漏掉!建议重新手写!

3. 代码

直接抄的话是会错的啦!是会 \(AF\) 的啦!

#include<bits/stdc++.h>
using namespace std;
int a,b,n,vis[1005],dp1[1005][1005],dp2[1005][1005];
deque<int> quemin,quemax;
int main() {
    scanf("%d%d%d",&a,&b,&n);
    for(int i=1;i<=a;i++) {
        // 清空双端队列
        while(!quemin.empty()) quemin.pop_back();// 相比 pop_front 更快一些
        while(!quemax.empty()) quemax.pop_back();
        // 横向区间最值问题
        for(int j=1;j<=b;j++) {
            scanf("%d",&vis[j]);
            // 插入最小值队列
            while(!quemin.empty()&&quemin.front()<=j-n) quemin.pop_front();
            while(!quemin.empty()&&vis[quemin.back()]>=vis[j]) quemin.pop_back();
            quemin.push_back(j),dp1[i][j]=vis[quemin.front()];
            // 插入最大值队列
            while(!quemax.empty()&&quemax.front()<=j-n) quemax.pop_front();
            while(!quemax.empty()&&vis[quemax.back()]<=vis[j]) quemax.pop_back();
            quemax.push_back(j),dp2[i][j]=vis[quemax.front()];
        }
    }
    // 纵向更新双端队列,求出答案
    int ans=1e9;
    for(int j=1;j<=b;j++) {// 纵向
        // 基本同上
        while(!quemin.empty()) quemin.pop_back();
        while(!quemax.empty()) quemax.pop_back();
        for(int i=1;i<=a;i++) {
            while(!quemin.empty()&&quemin.front()<=i-n) quemin.pop_front();
            while(!quemin.empty()&&dp1[quemin.back()][j]>=dp1[i][j]) quemin.pop_back();
            quemin.push_back(i);
            while(!quemax.empty()&&quemax.front()<=i-n) quemax.pop_front();
            while(!quemax.empty()&&dp2[quemax.back()][j]<=dp2[i][j]) quemax.pop_back();
            quemax.push_back(i);
            if(i>=n&&j>=n) ans=min(ans,dp2[quemax.front()][j]-dp1[quemin.front()][j]);
        }
    }
    printf("%d\n",ans);
    return 1;// 抄代码有风险,做题请自己做,谢谢
}

标签:题解,最大值,正方形,最小值,P2216,quemax,双端,quemin
From: https://www.cnblogs.com/TimelessWelkinBlog/p/17596598.html

相关文章

  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台大屏播放时出现数据未推送的问题解决
    LntonGBS平台实现视频直播、转码与分发、平台级联、云台控制等,拥有灵活丰富的视频能力。平台基于云边端一体化架构,在很多场景中均有落地项目应用,如智慧工地、智慧安防、智慧工厂、智慧园区等。近期有用户反馈其定制版LntonGBS平台现场播放24路上大屏时有部分通道存在30秒左右出现未......
  • P9481 [NOI2023] 贸易 题解
    题目链接题目要求我们求出任意两点间最短路径之和,由于图比较特殊,除树边外只有祖先到其子树内的边,我们首先考虑最短路径有没有什么特殊性质。注意到两点之间的最短路分为一下三种:节点到其祖先的最短路:直接沿着树边向上走即可,否则一定会走多余的边,不是最优。节点到其子树的......
  • 题解 [NOI2020] 命运
    Link题意给定一棵\(n\)个节点的有根树和\(m\)条祖先到后代的链。问有多少种把边权设置为\(0\)或\(1\)的方案使得每条链上至少有一条边是\(1\)。答案对\(998244353\)取模。\(1\leqn,m\leq5\times10^5\)题解我们将链的下端称为限制的起点。容易发现,对于同一......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台迁移服务器后无法启动的问题解决方案
    国标视频云服务LntonGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • 洛谷 U321190 麻将 加强加强版 题解
    Description给定一副\(k\)张牌的麻将牌,求能「听」哪些牌。对于所有数据,\(1\leqk\leq2\times10^5\)。link:https://www.luogu.com.cn/problem/U321190Solution算法零枚举「听」的牌,用状压DP或者贪心判断。时间复杂度\(\mathcal{O}(2^n\text{poly}(n))\)或\(\mathca......
  • DVWA靶场搭建过程 & 遇到的问题解决(apache标红、无法跳转等等)
    问题会在最后汇总解答第一步准备工作首先需要搭建PHP环境和获取DVWA源代码搭建PHP环境:搜索phpstudy→鼠标移动至windows版→点击phpstudy客户端→下滑,下载phpStudy2018Windows版本【注意,选择下载路径必须全英文】→获取到一个安装包,暂时不用解压。获取DVWA源代码:输入网站......
  • P1686 挑战 题解
    原题链接题目大意\(图上两个x或y值相同的点,如果其没有一条线段直接相连,则这两个点之间的距离为一条捷径\)\(给定一条路径,求此路径上最短的捷径长度(注意,是捷径最短)以及捷径的起止点和方向\)数据范围\(1\len\le250000\)\(先考虑x值相同的情况,假设有3个点A,B,C可以互相构成......
  • [JOI 2020 Final] 火事 题解
    题面给定一个长为\(N\)的序列\(S_i\),刚开始为时刻\(0\)。定义\(t\)时刻第\(i\)个数为\(S_i(t)\),那么:\[\left\{\begin{array}{ll}S_0(t)=0\\S_i(0)=S_i\\S_i(t)=\max\{S_{i-1}(t-1),S_i(t-1)\}\end{array}\right.\]共有\(Q\)个询问,每......
  • 【867】pgAdmin4 无法加载 loading 的问题解决
    ref:LoadingpgAdmin4v7.4...whileopeningpgAdminIhadthesameproblemwheninstallingpgAdminviathepostgresql-15.3-3-windows-x64installer.Solution:uninstallPostgreSQL;reinstallPostgreSQLbutinthecomponentsselection,uncheckPGAdmin;......
  • 【NOIP模拟题】我要的幸福 题解
    1.题意简述\(Zyh\)相信自己想要的幸福在不远处。然而,\(zyh\)想要得到这幸福,还需要很长的一段路。\(Zyh\)坚持认为整个人生可以抽象为一个\(n*m\)的棋盘。左上角的格子为\((1,1)\),右下角的格子为\((n,m)\)。整个棋盘上的格子都有不同的事件,因为生活的多姿多彩,事件的权值......