模拟60 题解
A. 嘟嘟噜
约瑟夫问题,然而线性过不去。
观察本题的特殊性质:m远小于n。
再看递推公式,发现当m很小的时候取模次数并不多,
所以在这种情况下可以直接用一次乘法代替多次加法。
B. 天才绅士少女助手克里斯蒂娜
拆一拆式子就可以将i和j分离出来。
然后用分治的思想在线段树上每次考虑合并就可以了,然而常数极大。
卡了很久常极限数据才跑进2s。
正解更简单,继续化简式子,可以直接改成区间求和的形式。
C. 凤凰院凶真
问题是两个字符串的最长上升公共序列。
可以很简单地转化为三维偏序问题,
一维排序之后二维树状数组就可以解决,然而复杂度是$O(n^2log^2n)$的。
然而出题人并没有卡掉我。
正解是将传统LCS中dp的含义略改一下。
设$dp(i,j)$表示串a考虑到第i个字符但不必选,串b考虑到第j个字符且必选的最优策略。
则有$dp(i,j)=max(dp(i-1,j),dp(i-1,k)+1)$。 $k<j$ $and$ $b[k]<b[j]$
传统的$dp$缺陷是对于上升的要求付出了太多代价。
这样$dp$可以只在$j$一维表示上升的要求,将$i$解放出来以优化复杂度。
因为单层转移的要求是相同的,随便优化一下就$O(n^2)$了