1 条题解
-
0
自动搬运
来自洛谷,原作者为

Zyc_zhouyuchen
I love coding. It makes me happy!搬运于
2025-08-24 22:53:04,当前版本为作者最后更新于2025-07-19 17:24:34,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
我的做法不多见哦 ovo。
没有高深的算法,只有朴素的思维。
题意
形式化题意:
给出整数 ,。。
给出一个 的 方格图。要取 段在行或列上长度为 连续的 ,且所取的位置不交。最大化 的值。
思路
可以直接输出最长段。
比较复杂。
发现如果一个答案合法,则较小答案的也合法。于是可以二分答案。
问题是如何快速判断答案是否合法。
同向
如果选择的两段同向,就很好办。可以预处理出横向和竖向的每种段长(指极长段的长)各有多少(桶排),再对求出的横竖两个段长数组分别计算后缀和。那么
check(x)时,如果长度 的横后缀或竖后缀数量 ,或者长度 的横或竖后缀 (注意别越界),返回true;否则返回false。异向
瓶颈是如何处理一横一竖的答案。观察发现,可以把横着的最长段和竖着的最长段取出来,计算这两段合起来最多放多少。计算方式如下:
称取出的最长横竖段长度分别为 。
若两段无交,就取较短一段的长度
若有交,取 ,其中 指竖段被横段切开的两段长度。横竖反一下也算一遍答案,两个答案取 。
而其他的横竖段都没有用。有些反直觉,但事实是这样。详细解释如下:
设其他任取的一对横竖长度分别为 。
如果 组成答案,那么答案一定小于等于 ,而 ,所以这对 构成的答案一定不优于 或者 ,这会在
check同向段时被判为合法。所以 的答案不会对求出最大答案产生影响。再解释一些可能让人起疑的细节:
Q:如果我其他任取的段,横段就是最长横 ,竖段 不是最长竖 ,会不会出问题?
A:并不会。假设 无交,如果 , 的答案 可以由 得到;否则, 的答案为 ,小于 的答案,而比一个合法答案小的长度也一定合法,所以 的答案也是没用的;若 有交,答案不会优于无交状况,所以也没用。
Q:待补充,欢迎各位在评论区提出质疑。
至于如何找到最长横竖段,扫一遍然后记录其位置即可。
综合
以异向部分求出的答案作为下界, 作为上界,二分答案即可。
时间复杂度上,
- 输入
- 预处理最大横竖段和段长数组
- 对段长数组求后缀和
- 求最大横竖段的答案
- 由于
check是 ,所以二分答案 。
总时间复杂度 。常数较小。
代码
代码糖分超标,不贴了,思路到了就行。
闲话
目前最优解,没怎么卡常,也没什么好卡。如果被超了麻烦告诉我,我再卡卡 awa。
- 1
信息
- ID
- 9454
- 时间
- 500ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者