啥都不会了,要长脑子了
E
观察发现关键的东西是删除了哪些数,考虑哪些删除序列是不合法的,假设删了 \(t\) 次,那么有 \(2tk\) 个数被删除,每次删除的要求是第 \(k\) 个和第 \(k+1\) 个不相邻,删除序列 \(k-1, 2tk-(2k-2), k-1\) 是不合法的,那么可以猜测一个删除序列合法当且仅当存在某个划分,使得两侧被删除总数均 \(\ge k\) ,可以发现这个结论是正确的。
那么考虑如何求,考虑容斥,总数为 \(C(n,2tk)\) 。不合法个数相当于,中间有一个 \(2tk-(2k-2)\) 盒子,两侧各有 \(k-1\) 个 \(1\) 盒子,需要把 \(n-2tk\) 个球插入到这些盒子中间,得到的所有序列都是不合法的,那么显然数量就是 \(C(n-2tk+2k-1, 2k-1)\) ,于是对于确定的 \((k,m)\) 就可以求出方案数了。
又注意到合法的 \((k,m)\) 对总数是 \(O(n\log n)\) 的,于是暴力枚举统计方案即可。
F
注意到对于一对 \(i, j\) ,使 \(x=\min(b_i,b_j)\) 最优,在这种情况下,那个式子等于 \(\max(b_i\land \lnot b_j, \lnot b_i \land b_j)\) ,则原问题等价于有两个集合 \(S_1=\{b_i\},S_2=\{\lnot b_i\}\) ,分别取一个数的与的最大值即为答案,由于 \(n\) 有限,故可以暴力维护两个集合,然后每次加入 \(x\) 的时候,将所有 \(x\) 的子集加入,最大值就是同时出现在两个集合中的最大值,时间复杂度 \(O(n\log n)\) 。
G
首先要想到用dp解决这道题目,令 \(f_x\) 表示以 \(x\) 为结尾的dfs序前缀max方案数(未遍历完全),考虑如何转移。考虑一个数 \(j\) 对 \(i\) 产生贡献的条件:
- \(dfn_j < dfn_i\)
- \(j < i\)
- \(1 \to i\) 的路径上没有比 \(i\) 大的点
- 若 \(j\) 不是 \(i\) 的祖先,那么 \(j\) 是以 \(lca(i,j)\) 为根的子树在 \(j\) 方向的子树中的最大值
- 若 \(j\) 是 \(i\) 的祖先,那么 \(j\) 是祖先中的最大值
对于第一条限制,我们可以通过控制dfs顺序得到,即先遍历子树max小的儿子,另一个限制 \(j < i\) 可以通过BIT解决,剩余3个限制则通过dfs中的操作顺序可以解决。