题面
$T1$
Solution
看一看样例,发现是每次能向下跳两步就跳两步,没法就一步或者往回跳,模拟一下即可。
Code
1 |
|
$T2$
Solution
先简化一下题意:给一个序列,再给出几个形如 $(l,r)$ 的条件,表示 $[l,r]$ 中至少要删去一个数。求一个方案,使得删去的数的总和最小。
我们考虑这样一件事:当 $r_i=r_j$ 时,我们显然只需要删除在 $\max(l_i,l_j)\sim r$ 中的一个数即可(贪心)。
所以我们可以对所有 $r$ 相同的限制,我们取一个左端点的最大值来作为最终的左端点。
我们设 $dp_i$ 表示删除第 $i$ 个,且 $[1,i-1]$ 中不存在禁忌词的最小花费。显然,最后的答案为 $dp_{n+1}$ 。
考虑转移。
假设在 $1\sim i-1$ 中最大的 $l$ 为 $L$ ,那么我们显然只能从 $L\sim i-1$ 中的 $dp$ 转移过来。(因为要保证之前的所有条件都满足)。
因为要代价最小,所以我们相当于求 $\min_{j=L}^{i-1}dp_j$ 。
因为 $L$ 是单调不降的,所以我们可以用单调队列优化 $dp$ 。
Code
1 |
|
$T3$
Solution
可以发现两个端点是互不影响的,所以我们可以算出每一端的答案,再乘起来。
明显的,我们可以知道每一条链上只能选一个点,且有且仅有一个能放在该链上。
我们可以先处理出每一个点所有的子树中选 $i$ 的答案。
这样做的复杂度为 $O(\sum_{i=1}^{n} d_i^2)=O(n\cdot L)$ 。
在查询时,我们需要删去一个子树的贡献,我们是可以推出删去之后的贡献的(详细见代码)。
然后我们即可以直接计算了。
对于计算答案的时候,我们采取如下策略:
其中 $i$ 枚举的是有几个选则了链上的点, $s$ 表示一种合法的选取方式, $S$ 表示所有的选取方式的集合,即 $dp_{u,i}$ 。
$i!$ 是由于之前没有确定顺序,需要求个排列, $C_k^i$ 是由于我们需要确定这 $k$ 个中哪几个用的是链上的点。
$i!\cdot C_k^i$ 还有一种理解方式是:这 $k$ 个位置中,第一个点有 $k$ 种放法,第二个点有 $k-1$ 种放法,以此类推,一共有 $\frac{k!}{(k-i)!}$ 种方式,这其实是一个下降幂,计算时即为前面的东西。
Code
1 |
|