atcoder ABC410 部分题解

E - Battles in a Row

题目链接

朴素的想法是设 \(f_{i,j,k}\) 表示剩余 \(j,k\) 的局面能否达到。

容易优化成 \(f_{i,j}\) 表示剩余 \(j\) 体力时最多剩余多少法力,因为低于这个值得操作都是劣的。

F - Balanced Rectangles

神币

题目链接

题目提到 \(h\times w \leq 3\times 10^5\) ,意味 \(\min(h,w)\leq \sqrt{3\times 10^5} \approx 600\) ,不妨令 \(\min(h,w)=h\),我们可以实现一个 \(O(h^2w)\) 的做法(对于 \(h>w\) 的情况,颠倒一下就可以了)。

锁定两行后,只考虑列就是个一维问题了,维护出列的前缀和用哈希表维护一下就可以了。

注意直接用 map 之类的多一个对数,要使用线性做法。可以使用固定偏移处理负数直接在数组上维护,也可以哈希表,有个很奇怪的点:用普通的 unordered_map 和只使用 xor 位移的 unordered_map 可以过,加一个时间偏移就过不了?

G - Longest Chord Chain

题目链接

从题目来看,可以转化出选择尽可能多的不相交的弦即为答案,这个不相交有特殊的意义:需要使得存在一种顺序使得选择的弦左端点单调,右端点也单调(可以看最后一个样例)。

考虑断环为链,一个弦 \((x,y),x<y\) 可以划分成三个独立的区间 \((x,y),(y,x+2n),(x+2n,y+2n)\)三个区间彼此独立互不干扰,转化成线性问题,这里转化成求尽可能多的区间,使得一个区间总是完全包含下一个区间。

由于给定的弦 \(x,y\) 两两不同,因此在线性下一个位置只可能有一个数,我们令 \(a_x\) 设为以 \(x\) 为左端点的区间,其右端点是哪

根据左端点单调,右端点也单调的原则,这个线性问题已经保证了左端点单调上升,现在只需要保证右端点单调下降,且要选最多的区间,那可以自然想到求最长下降子序列了(\(a\) 的下标表示左端点单调上升,只需要保证 \(a_x\) 的值单调下降就可以)。

于是将 \(a_x=y,a_y=x+2n,a_{x+2n}=y+2n\) ,转化成求最长下降子序列就可以了,注意要去除那些没有数的位置。

posted @ 2025-06-15 00:24  蒻蒻虫  阅读(34)  评论(0)    收藏  举报