AtCoder Regular Contest 121

A

保留 \(x,y\) 中的次大,最大,次小,最小,显然答案一定在它们之间。然后暴力算。时间复杂度 \(O(n \log n)\),瓶颈在排序。

B

若所有颜色均出现偶数次,则答案为 \(0\)

否则若只出现了两种颜色,则枚举一种颜色的所有 \(a_i\)lower_bound 去找另外一种颜色中和 \(a_i\) 最接近的值即可。

如果三种颜色都出现了,那么在只有两种颜色的基础上,答案还可能是两种出现奇数次的颜色跟另外的颜色最接近的值的绝对值之和,取最小值即可。

C

每次肯定是选择一对逆序对然后交换。如果当前没有可以操作的位置,就选 \(n-1,n\) 或者 \(n-2,n-1\) 换,具体是什么看奇偶性。

看起来不是很对,但是能过(((

D

考虑如果限制每次只能选两个怎么做。显然可以将序列排序后贪心地选最小和最大,次小和次大,等等配对。

如果每次可以选一个,那么就相当于选它和一个 \(0\) 配对。然后就想到枚举选一个的次数,然后再按上面的方法贪心。

时间复杂度 \(O(n^2 \log n)\)

E

显然 \(a_i\) 可以是除了 \(i\) 的所有祖先以外的任意点。考虑求 \(a\) 的逆排列 \(b\)\(b_i\) 就不可能是 \(i\) 子树内的点。

考虑一个容斥,\(g_i\) 为钦定其中 \(i\) 个结点不合法的方案数。那么 \(ans = \sum\limits_{i=0}^n (-1)^i g_i (n-i)!\)

现在问题转化成了如何求 \(g_i\)。考虑树形 dp,\(f_{u,i}\) 表示 \(u\) 子树内有 \(i\) 个点不合法 且只考虑不合法的点 的方案数。

  • 不同子树,因为不合法的范围不交,所以可以直接类似树形背包合并,\(f_{u,j+k} \gets f_{u,j} \times f_{v,k}\)
  • 最后计算 \(u\) 不合法的情况的 dp 值时,\(f_{u,i} \gets f_{u,i-1} \times ((sz_u-1)-(i-1))\),意思是 \(u\) 原本可以选子树内的 \(sz_u-1\) 个点,有 \(i-1\) 个点已经被选了。

那么 \(g_i = f_{1,i}\)

时间复杂度 \(O(n^2)\)

F

如果存在一个叶子结点值为 \(1\),且连向它的父亲的边是 OR,那么这样就是合法的。因为可以最后再缩它,那么根结点的值就是 \(1\) 了。

否则分类讨论:

  • 如果值为 \(1\) 且 AND 或者值为 \(0\) 且 OR,那么什么时候缩边都没有影响,可以立即缩。
  • 如果值为 \(0\) 且 AND,就相当于在一个时刻将它的父亲的值设为 \(0\)。显然要贪心地一开始就立即缩。

然后我们发现缩边可以按照深度从大到小缩,顺序确定了,考虑树形 dp,\(f_{u,0/1}\) 表示 \(u\) 子树已经操作完了且不含 \(1\) OR,\(u\) 的值为 \(0/1\) 的方案数;\(g_u\) 表示 \(u\) 子树已经操作完了且包含 \(1\) OR 的方案数。转移也是显然的,分八种情况(\(0/1\) OR/AND \(0/1\))讨论即可。

时间复杂度 \(O(n)\)

posted @ 2022-12-08 11:08  zltzlt  阅读(18)  评论(0编辑  收藏  举报