当前位置 : 主页 > 网络编程 > 其它编程 >

P2216[HAOI2007]理想的正方形单调队列

来源:互联网 收集:自由互联 发布时间:2023-07-02
这种矩形问题常用单调队列优化枚举(通过贪心取最优降低了一个维度的枚举)推荐这道题也要做一做:[\[ZJOI2007\]棋盘制作][1]单调队列的空间记得开大点!反正内存够用注意,这 这种
这种矩形问题常用单调队列优化枚举(通过贪心取最优降低了一个维度的枚举)推荐这道题也要做一做:[\[ZJOI2007\]棋盘制作][1]单调队列的空间记得开大点!反正内存够用注意,这

这种矩形问题常用单调队列优化枚举(通过贪心取最优降低了一个维度的枚举)推荐这道题也要做一做:[ZJOI2007]棋盘制作单调队列的空间记得开大点! 反正内存够用注意,这题正方形边长是固定的!暴力算法是枚举上边界所在的行,左边界所在的列,通过这两个个信息确定一个正方形,然后预处理出一行中从第i个点到i+n个点的最值,再扫一遍这个正方形的行,复杂度是N^3

预处理的时候,复杂度也是N^3。。。考虑用单调队列来维护,枚举到一行,看做一个序列,求长度为n的区间最值,就是一个滑动窗口,如果不大明白的话去做一下这道题:P1886 滑动窗口

求答案的时候,也可以用单调队列优化掉一层枚举,那么优化掉行的枚举吧。行不再需要枚举,只需要在每列枚举的时候维护单调队列,因为正方形边长是固定的,只需要知道所在的列是什么,就可以知道所在的行

以求最大值为例:枚举到一列的时候,直接扫一遍行,我们不是预处理出一个f[i][j]表示包括第i行第j列的那个元素往后n个元素的最值了么,把他放到一个单调递减的队列里面,并且维护队列长度不超过n,此时这个正方形的最大值就是队头。

仔细想想,若目前有一个元素比队列里面的元素都要大,那么在以后求最大值的时候我便不需要知道这个元素之前的那些元素具体是什么,因为目前有个更大且能生存更长时间的元素,所以前面的那些都可以扔掉,直接出队就好了,维护时效性与最优性

!!!注意,更新答案之前必须保证队列里面有且仅有n个元素,也就是说要加一句 i >= n 的特判,不然就会导致还没构成一个正方形就把答案更新了的错误情况

#include #include #include #include #include #include using namespace std;#define debug(x) cerr <<#x <<"=" <P2216 [HAOI2007]理想的正方形 - 单调队列

【文章原创作者盐城网站设计 http://www.1234xp.com/yancheng.html 提供,感恩】
上一篇:61个百倍项目的特征,寻找下个周期alpha
下一篇:没有了
网友评论