模拟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)$了

posted @ 2019-10-06 09:43  skyh  阅读(190)  评论(0编辑  收藏  举报