省选模拟13

A. 同桌的你

  考试的时候大概一上来就会了,然而感觉非常麻烦,不想打。等到最后剩1个半小时的时候开始打,到最后也没调出来,非常自闭。

  不难发现将关系连边得到的是一棵基环树,所以可以考虑断掉环上任意一条边,然后分选择这条边和不选这条边分别做一次树形dp即可。

  对于输出方案,考虑记录转移的前驱,之后再dfs一遍输出答案。

B. 大水题

  考虑枚举每一种颜色方案,将所有颜色的数量与第一种颜色的数量做差,那么区间[i,j]合法的条件是[1,i]和[1,j]差分之后相同,可以使用hash来完成这个过程。

  然而暴力的复杂度是$O(n*2^8*O(hash))$,听上去就很不对。

  所以考虑优化。

  对于一个确定的右端点,可能有贡献的方案只有8种,所以考虑只维护这8种方案。

  枚举右端点,在右端点右移的时候,找到当前右端点颜色的前驱,只需要修改这一段即可。

  复杂度均摊$O(8n*O(hash))$

C. 佛罗里达

  考场上大概想到了40分的暴力做法,可是没有想到2-sat,以为并查集也能实现这些操作。

  考虑枚举其中一个集合的权值大小,对于另外一个集合权值显然可以二分,考虑如何检验是否存在合法解。

  将边按照与两个集合权值大小的关系分类,分别对应随便选,不同时选,选一个,是显然的2-sat模型,tarjan判断即可。

  考虑如何优化这个东西。

  求出来一棵最大生成树,那么生成树上的边一定可以作为集合的权值。

  否则,将树黑白染色,若某一条非树边连接了两个颜色不同的点,那么必然不是最大的。

  所以,集合的权值只能是树边或者全部为颜色相同的点时的贡献。

  枚举即可,$O(n^3logn)$

 

posted @ 2020-01-30 21:50  tdcp  阅读(99)  评论(2编辑  收藏  举报