模拟测试71

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)$。

原文地址:https://www.cnblogs.com/hz-Rockstar/p/11678456.html