2025/12 做题记录

  1. P14636 NOIP2025 清仓甩卖 / sale

    考虑这个策略为啥会爆。发现当选取了一段价值和为 m-1 的前缀之后,就只能取接下来的一个 1 了。但是如果这个前缀后面的 2 可以代替这个 1,以及前缀中价值最小的 1,那么就爆了。考虑刻画这个性质。假设 \(a_k\) 代替了 \(a_i\)\(a_j\)。那么我们枚举 \(i\)\(k\)。将所有物品归类为以下几类:

    如果 \(w\)\(1\) 的时候在 \(i\) 前面,\(w\)\(2\) 的时候仍然在 \(k\) 前面,那么称之为 A 类。对前缀可能造成 +1/+2 的贡献。

    如果 \(w\)\(1\) 的时候在 \(i\) 前面,\(w\)\(2\) 的时候在 \(k\) 后面,那么称之为 B 类。对前缀可能造成 +0/+1 的贡献。

    如果 \(w\)\(1\) 的时候就在 \(j\) 的后面,那么只要把方案数乘上 \(2\) 即可。

    我们希望对 A 类和 B 类物品进行选择,使得和为 \(m-2\)。容易发现只要知道 A 类和 B 类物品的个数,贡献就是一个组合数。而固定了 \(i\)\(k\),知道 A 类和 B 类物品的个数是容易的,可以 \(O(1)\) 求出。现在只要关心:对于所有可能的 \(j\),贡献系数的和是多少。发现将 \(a_i\) 从大到小排序后可能的 \(j\) 是一段后缀,因此只要知道了有多少个可能的 \(j\),贡献系数的和就是某个 \(2\) 的次幂减去 \(1\)。求多少个可能的 \(j\) 也是容易的,直接双指针一下即可。发现还有一种情况是后面全是 \(w=2\),没有选择任何一个 \(j\)。处理这种情况是容易的,此时贡献系数的和变成了某个 \(2\) 的次幂。总复杂度 \(O(n^2)\)

  2. P4695 [PA 2017] Banany

把式子拆成 \(a_t-(dep_s+dep_t-2\times dep_{lca(s,t)})\), \(dep_s\) 一项可以忽略。考虑先判掉 \(t\)\(s\) 子树内的情况,这是容易的。然后枚举 \(lca(s,t)\), 求出不和 \(s\) 在一个子树里的 \(a_t-dep_t\) 的最大值。类似 P11330 的套路,定义 \(g_s\) 为不考虑 \(s\) 的重儿子,\(a_t-dep_t+2\times dep_s\) 的最大值。查询的时候只需要考虑每个重链的底端即可。一共要动态维护每个点的 \(dep\),每个点的 \(a_x-dep_x\),以及 \(g_x\),总复杂度双 \(\log\)

  1. CF1119F Niyaz and Small Degrees

类似 P11038 的套路,考虑让所有点的度数 \(\lt i\) 的时候本来度数就满足条件的点是无用的,只用对度数 \(\ge i\) 的建出虚树。最简单的 dp 是 \(f_x\) 表示强制断掉 \(x\) 和父亲的边,满足条件的最小代价;\(g_x\) 表示强制连上和父亲的边。转移就先假装断了 \(x\) 的所有儿子,然后连上 \(ch-1/ch\) 个儿子,贪心地选 \(\Delta\) 最小的。于是在虚树上 dp 的时候对每个点维护对顶堆优化这个过程即可。

  1. CF1511G Chips on the board

\(cnt_i\)\(c_x=i\) 的个数。对于一组询问 \((l,r)\),显然 \(\oplus_{i=l}^{r} cnt_i\times (i-l)=0\) 的时候答案是 B, 否则答案是 A。先将所有 \(cnt_i:=cnt_i\bmod 2\)。接下来定义 \(f_{i,j}\) 为考虑 \([i,i+2^j-1]\) 中的数,\(\oplus_{k=i}^{i+2^j-1} (k-i)\times cnt_k\) 的值是多少。倍增的时候我们容易发现,只有最高位会受到影响,而这只和区间中有多少个非 0 的 \(cnt_i\) 有关。询问的时候我们同样发现,按从大往小的顺序倍增后,只有最高的几位会受到影响,和低位无关,可以快速计算贡献。总复杂度 \(O((m+q)\log n)\).

  1. TCO2011 Round 2 CircuitDesign

首先把两行中的孤点拿出来,最后再插回去,容易发现每个点都可以插在任意位置。然后发现每个连通块都可以独立考虑,最后乘上连通块数量的阶乘即可。现在我们只要对每个连通块单独求解。如果成环显然无解。否则显然是一棵树。一个很重要的结论:对于一个度数 \(\ge 2\) 的点,绝对不可能连 \(\gt 2\) 个度数 \(\ge 2\) 的点。这是显然的,如果这种情况出现显然会相交。因此我们发现,只考虑度数 \(\ge 2\) 的点,实际上形成了一条链!而每个点附近的度数为 \(1\) 的点可以随便排。最后再乘上这条链正过来和反过来两种情况即可。如果链是孤点,那么只有一种情况。

  1. P9357 Lighthouse
posted @ 2025-12-09 13:35  malin123  阅读(2)  评论(0)    收藏  举报