『题解』JOISC2022B 京都観光 (Sightseeing in Kyoto)

发布时间 2023-08-24 21:12:59作者: iCostalymh

AtCoder 题目链接

Luogu 题目链接

观察题目,不自觉地想到了 dp,但是再一看 \(\text{1e5}\) 数据范围,意识到大概是 \(2^{\text{1e5}}\) 的复杂度,绝望了……

然后就很自然地想到了最优策略。(思路很巧妙但是我当时没想到。)

考虑有三行(或三列),分别记为 \(i, j, k\),如果 \(j > i \land j > k\)(也就是一个峰),那么走 \(j\) 显然不优,就可以把 \(j\) 删去。

维护的话可以考虑用优先队列把行和列维护在一起(当然也要同时维护是行还是列),乱搞就行了,复杂度 \(O((h+w)\log(h+w))\),可以通过原题,但是可以被更大的数据卡掉。

那么就存在一种更优解。最开始的思路就是删峰,显然可以用单调队列维护凸包,分别维护行和列,看哪个最优先取哪个,直到两个单调队列都剩一个元素。复杂度是 \(O(h+w)\)

代码挺好写的,就放个链接吧。我写的是不带 \(\log\) 的。