HNOI2017

单旋 \((\texttt{Easy} \ 2 / 4)\)

记录一下树的形态,用 \(\rm LCT\) 维护,access(u) 之后 sz[u] 就是 \(u\) 的深度。

时间复杂度 \(\mathcal{O}(n \log n)\)

影魔 \((\texttt{Easy} \ 2 / 3)\)

对于一个区间,如果其最大值在端点处,则它对答案有 \(p_2\) 的贡献;如果其次大值在另一个端点处,则它对答案有 额外的 \(p_1 - p_2\) 的贡献。

考虑第一部分如何统计。对于 \(a_i\),设使得 \(j < i \wedge a_j > a_i\) 的最大 \(j\)\(pre_i\),使得 \(j > i \wedge a_j > a_i\) 的最小 \(j\)\(nxt_i\)。对于第一部分,如果最大值是 \(a_i\),那么另一个端点肯定的可行范围是 \((pre_i, nxt_i)\)。所以这一部分的贡献次数就是所有的 \((pre_i, nxt_i)\)\([l, r]\) 的交的长度和,可以离线 \(\mathcal{O}(n \log n)\) 求出。

考虑第二部分如何统计。枚举次大值,发现只有 \([pre_i, i]\)\([i, nxt_i]\) 这两个区间满足 \(a_i\) 是次大值,于是也可以 \(\mathcal{O}(n \log n)\) 统计了。

注意减去长度为 \(1\) 的区间对答案的贡献。

时间复杂度 \(\mathcal{O}(n \log n)\)

礼物 \((\texttt{sb} \ 0 / 1)\)

\(\rm FFT\) 板题。

Achtoria \((\texttt{Easy} \ 3 / 4)\)

首先用一个朴素 \(\rm DP\) 计算出最多有多少天不进行 \(2\) 操作,记为 \(D\)。那么我们就可以忽略 \(a\)\(w\),唯一的目标需要在 \(D\) 次操作内让 Achtoria 的自信值变为 \(0\)

\(d_x\) 表示通过 \(3, 4\) 操作使讽刺能力 \(F\) 变为 \(x\) 的最短操作步数,发现使得 \(d_x \le 100\)\(x\) 其实是不多的,我们可以通过一个 \(\rm BFS\) 求出。\(\rm BFS\) 的时候需要一个状态需要记录当前的 \(F\)\(L\) 以及步数。

判断的时候可以枚举 \(1\) 操作和 \(5\) 操作用几次,如果 \(5\) 操作用两次的话就搜一下两个数分别是多少,加一点剪枝就能过了。

虽然这个做法简单,但是我真的想错过很多次。。。代码也写错过很多次。。。

如何做到基本不想假还是一个亟待解决的问题。

题解的判断做法和我的不太一样?这个做法不用枚举 \(1\) 操作步数,并且实现更为简便。

仅讨论 \(5\) 操作使用 \(2\) 次的情况。设我们找出的两个数为 \(x, y\),那么只需满足

\[ \begin{cases} d_x + d_y \le C \\ d_x + d_y + C - x - y \le D \end{cases} \]

枚举 \(x\),用双指针扫一遍即可。

Achtoria 快跑

不会,鸽了。

抛硬币 \((\texttt{Easy} \ 2 / 5)\)

答案即

\[ \begin{aligned} & \sum\limits_{i = 0} ^ b \sum\limits_{j = i + 1} ^ a \binom{b}{i} \binom{a}{j} \\ = & \sum\limits_{k = 0} ^ {a + b} \binom{a + b}{\min\{b, \left\lfloor \frac{k - 1}{2} \right\rfloor \}} \\ = & 2^{a + b} - \sum\limits_{k = 2b + 1} ^ {a + b} \binom{a + b}{k} + (b - a) \binom{a + b}{b} \\ = & 2^{a + b} + (b - a) \binom{a + b}{b} - \sum\limits_{k = 0} ^ {a - b - 1} \binom{a + b}{k} \end{aligned} \]

求组合数使用 \(\rm exLucas\) 即可。

posted @ 2022-02-10 20:00  Scintilla06  阅读(19)  评论(1编辑  收藏  举报