模拟测试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)$。