11.18 联测

怎么今天打 Div2 啊。


Div1 T1

求一棵树所有编号区间导出子图的连通块数之和。

扫一遍 ii,统计以 ii 为左端点的区间的答案之和。维护 ansxans_x 表示 [i,x][i,x] 的答案。

先暴力求出 i=1i=1{ans}\{ans\},考虑删除一个数对连通块数的影响。

发现删除 uu 会使连通块数增加 du1d_u-1dud_u 表示 uu 的度数。

也就是说 {ans}\{ans\} 的变化是:一段 1-1,一段 +0+0,一段 +1+1,一段 +2+2,以此类推。

发现这样的区间数为 degudeg_udegudeg_u 表示 uu 在原图上的度数。所以总区间数 O(n)O(n)


Div2 T1

发现严格大于和严格小于是对称的,我们只需把总方案减去相等的方案再除以二即可。

现在我们要统计长度为 nn 的排列 {a}\{a\},使得 aa 的逆排列还是 aa

fif_i 表示 n=in=i 时的答案。

  • ai=ia_i=i,此时从 fifi1f_i \larr f_{i-1}
  • ai<ia_i<i,此时在 [1,i)[1,i) 中选择一个数跟 ii 配对,此时 fifi2×(i1)f_i \larr f_{i-2} \times (i-1)

Div2 T2

发现一个点的深度就是他的 popcountpopcount

考虑在把贡献挂在 uu 的祖先上,然后容斥。

f(u,i)f(u,i) 表示 uu 子树距离 uuii 的点有几个。

uu 的深度为 xx,那么 f(u,i)=(xi)f(u,i)=\binom{x}{i}


Div1 T2

把全部点按颜色排序。

颜色 c1c-1 向颜色 cc 转移:fi,jfx,y+ix+jyf_{i,j} \larr f_{x,y}+|i-x|+|j-y|

第一维按 xx 值排序扫描线解决,第二维用线段树解决。