高开省选 Day 1

1 minute read

Published:

B 10371: 平均

给定一个长为 $n$ 的序列 $a$,每次操作你可以选择一个数 $a_i$ 满足 $a_{i-1}, a_i, a_{i+1}$ 形成等差数列,将 $a_i$ 从 $a$ 中删除(不可以选择 $a_1$ 和 $a_n$)。 求最少剩几个数。 $n \le 3 \times 10^5$,$1 \le a_i \le 10^9$。

蓝题签到。

首先注意到问题只和 $a$ 的差分有关。令 $b$ 为 $a$ 的差分数组。

令 $k_i = \nu_2(b_i)$,按照 $c_i = \frac {b_i} {2^{k_i}}$ 分颜色段。($\nu_2$ 写代码的时候可以写 __builtin_ctz)每个颜色段的问题是独立的。

称一个区间合法当且仅当整个区间能被合成一个数。

把精力放在 $k$ 数组上。抄 P3147 [USACO16OPEN] 262144 P 这个题的思路,令 $f_{i,j}$ 表示以 $j$ 为左端点来合成 $i$ 的右端点,转移 $f_{i,j} = f_{i-1,f_{i-1,j}}$,即对着 $j$ 套两次 $f_{i-1, *}$。对每个左端点处理出哪些右端点合法。

合法的区间个数是 $O(n (\log V + \log n))$ 很少,所以可以直接看怎么拼区间是区间数目最少。

总时间复杂度 $O(n (\log V + \log n))$。

A 10370: 排列

对于一个 $[1,n]$ 的排列 $f(p)$,

  • $f(p)$ 是 $p$ 对应的置换环个数
  • $g(p)$ 是 $i < p_i$ 的 $i$ 的个数

$ans_{i,j}$ 是 $f(p) = i$ 且 $g(p) = j$ 的 $p$ 的个数。求出整个 $n \times n$ 的 $ans$ 数组。

$n \le 500$。对大质数取模(大质数会变,无法打表)。

(以下用 $a += b$ 代表 $a \gets a + b$)

从小到大依次插入,把环上还没插入的部分看成一条边。每次插入要么开一个新环(自环),要么被插入到已有的某一个环中。

令 $f_{i,j,k}$ 为插入到 $i$ 这个点且 $f = j$ 且 $g = k$ 的方案数。

  • 不在之前任何一个环,开一个环。
    • $f_{i,j,k} \gets f_{i-1,j-1,k}$
  • 被插入到某一个环中,枚举在哪条边被插进去。
    • 每次插入必定是一条 $u < p_u$,一条 $u > p_u$。
    • 被删掉的那条边是哪种呢?分情况:
      • $f_{i,j,k} += f_{i-1,j,k} \times k$($k$ 个 $u < p_u$ 的边可以断)
      • $f_{i,j,k} += f_{i-1,j,k-1} \times (i-k)$($i-k$ 个 $u \ge p_u$ 的边可以断)。

$O(n^3)$。滚动数组卡一下空间。

C 10372: 最大独立集

给定一棵 $n$ 个点的树,点 $u$ 的点权为 $a_u$。给定 $m$ 组询问,每次询问给定 $u,k$,求距离 $u$ 不超过 $k$ 的点的最大独立集。

$1 \le n,m \le 2 \times 10^5$,$1 \le a_u \le 10^9$。离线。

TODO: 还没会!

邻域问题的套路。

如果只看子树而不是邻域,是长链剖分。

$f_{u,i}$ $u$ 为根,$i$ 是深度上限。(这是一个信息,不一定是整数)$f_{u,i}$ 可以由 $f_{v,i-1}$ 算出来,$v$ 是 $u$ 的儿子。

但是这是平方的,用长剖优化。

离叶子的距离叫做高度。长儿子只有一个,令 $v_0$ 为 $u$ 的长儿子。

$i$ 保留到高度即可。从长儿子继承信息。

$d$ 是除了长儿子以外的最大深度,$i>d$ 时,只有长儿子还在更新。

用一个线段树维护长儿子链。$O(n \log n)$。

回到原问题,Kubic:换根长剖

$g_{u,i}$ 外子树的信息。询问把 $f$ 和 $g$ 拼起来。

$O(n \log n)$