专栏文章

IOI2024 Day2T1

P11052题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mip18jga
此快照首次捕获于
2025/12/03 04:30
3 个月前
此快照最后确认于
2025/12/03 04:30
3 个月前
查看原文
首先考虑保证有解的情况,目标是找到一组可能的解,不需要 check。
如果一种字符在 aa 中出现 xx 次,在 bb 中出现 yy 次,那么在解 cc 中需要出现 min(x,y)\min(x, y) 次。
将出现次数较少的一侧的元素标记为关键位,我们要将所有关键位在另一个序列中找到匹配,且匹配两两不交。
考虑两个序列中的第一个关键位 aia_{i}bjb_{j},接下来分类讨论:
如果它们相等,直接匹配即可。
否则,如果 aia_{i}b1j1b_{1 \dots j-1} 中没有出现,则 bjb_{j} 需要匹配 a1i1a_{1 \dots i-1} 中的某个字符,可以匹配然后递归;对于另一边同理。
剩下的情况是 aia_{i}b1j1b_{1 \dots j-1} 中出现且 bjb_{j}a1i1a_{1 \dots i-1} 中出现。
如果 ai+1na_{i+1 \dots n}bjb_{j} 的出现次数小于 bjmb_{j \dots m}bjb_{j} 的出现次数,则 aia_{i} 不能匹配 b1j1b_{1 \dots j-1} 中的字符,可以直接将 bjb_{j} 匹配掉然后递归。对于另一边同理。
剩下的情况可以说明其无解。
考虑 n,m3000n, m \leq 3000 的部分分,下面我们要设计算法 check cc 的正确性。
我们现在想要构造一个 SS,使得 SS 不是 cc 的子序列,但为 a,ba,b 的子序列。
假设求出了 c1ic_{1 \dots i}a,ba,b 中的匹配位置为 pai,pbipa_{i}, pb_{i}
依次加入字符,维护 a,b,ca,b,c 上分别匹配到了 a1i,b1j,c1ka_{1 \dots i}, b_{1 \dots j}, c_{1 \dots k}。我们现在想让 a,ba,b 上匹配,cc 上失配。
如果 i<paki < pa_{k}j<pbkj < pb_{k},则加入 ckc_{k \dots},就能构造无解。
可以说明只有在某次走到 i<paki < pa_{k}j<pbkj < pb_{k} 时,才能构造无解。
于是我们可以考虑 DP 计算 i=paki = pa_{k} 时最小的 jj,设为 fkf_{k}。可以暴力枚举 ii 的上一个转移的位置,然后二分出新的匹配位置,在转移过程中可以判定有没有 i<paki < pa_{k}j<pbkj < pb_{k} 的情况。
对于 j=pbkj = pb_{k} 时最小的 ii,将 a,ba,b 交换做一遍即可。
时间复杂度 O(n2logn)O(n^2 \log n)
考虑优化时间复杂度。
对于可转移到 ii 前的一个点,可分为两个区间,一个满足走一步后 i=paki = pa_{k},另一个满足走一步后 i<paki < pa_{k}。区间的端点可以二分得到。
用线段树维护 ff 的区间最小值,对于两个区间,前一个可以转移到 fkf_{k},后一个可以用于判定无解。
n,mn,m 同阶,时间复杂度 O(nlogn)O(n \log n),期望得分 100。

评论

1 条评论,欢迎与作者交流。

正在加载评论...