模拟测试71

北战南征 提交于 2019-12-01 10:04:55

T1:

  直接搜索子集复杂度太高,考虑meet in the mid。

  先将两段内部的答案处理出来,暴力枚举子集即可。

  将所有数分成两半,在前一半里枚举集合和子集,在后一半里枚举集合,判断前一半的子集是否为并集的一半,再反过来枚举一遍。

  时间复杂度$O(6^{\frac{n}{2}})$。

T2:

  先判断无解情况。

  考虑逆序关系,每个数只能接受一个方向的逆序关系,且不能不接受逆序关系。

  然后就可以DP了。

  设$dp[i][j]$为在前$i$个数中$i$的排名为$j$的方案数。

  当$i$存在向右的逆序关系,$dp[i][j]=\sum \limits_{k=1}^{j-1}dp[i-1][k]$。

  反之,$dp[i][j]=dp[i-1][j-1]$。

  前缀和优化一下即可。

  时间复杂度$O(n^2)$。

T3:

  一道正解是随机化的题。

  将所有的$x$random_shuffle一下,然后枚举,先判断当前值是否比之前更优,若不能让答案更优,直接continue掉。

  如果能使答案更优,在二分答案。

  能让答案变优的$x$的期望个数为$logp$个,所以时间复杂度为$O(nlognlogp)$。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!