「Log」2023.12.18 小记

序幕

\(\text{6:40}\):准时到校,昨晚睡得很香。

简单收拾了下机房,把自己带进来的泥脚印擦干净了。

配置了下新耳机,整理整理博客准备打题。

和同学稍微聊了一下昨天的 THUPC,我在会考所以没能打,太可惜。

边吃饭边看题(CF121E)。

感觉可以维护一个差的贡献,但是需要重构。

后来考虑到合法数字个数很有限,觉得可以对每个数字分别维护个什么,但实际上没啥用。

其实把上面两条连起来就可以得到正解了,可惜没想到。

\(\color{blueviolet}{CF121E}\)

看题解之后选择了一种较为优异的写法。

树状数组维护每个位置是否是合法数字,区间修改直接暴力修改,发现此处的值贡献有变再用树状数组进行修改,枚举的复杂度是巨大的,但考虑到每个数递增,并且合法数字数量不多,所以修改次数是少量的,总复杂度大概 \(10^9\) 出头,常数很小,跑得飞快。

\(\color{blueviolet}{CF429C}\)

按子树大小从大到小枚举合法父亲进行搜索,复杂度是阶乘级别,无法接受。

发现子树大小为 \(1\) 的节点父亲是谁都无所谓,所以不用枚举,并且根据题目中“非叶子节点子节点个数至少为 \(2\)”这条性质可以得到叶子节点个数超过一半,复杂度降为 \(\left\lfloor \frac{n}{2} \right\rfloor !\),可以接受。

\(\color{blueviolet}{CF1394D}\)

首先转化题意,相当于对于每个边选定其方向,然后合并合法路径减小总代价。

考虑没有 \(b_i = b_j \quad (i \not= j)\) 情况,也就是说相邻点对的大小关系是固定的。此时对于任意边 \((u, v) \quad (b_u < b_v)\),都钦定方向 \(u \to v\) 是最优的。(或者都钦定为 \(v \to u\),这两种方式等价,此题解中采用 \(u \to v\)。)此时一个点 \(u\) 贡献的代价 \(val_u\)\(\max \{ d0_i, d1_i \} \times a_u\),其中 \(d0_u, d1_u\) 分别表示其入度和出度。总代价即所有点代价之和。

重新考虑原问题,我们设 \(f_{i, 0/1}\) 表示节点 \(i\) 子树内,在 \((i, fa_i)\) 这条边被钦定为向上/向下的最小代价。假设现在正在处理节点 \(u\),对于 \(b_v \not= b_u\) 的子节点 \(u\) 的贡献是固定的,我们只需要考虑 \(b_v = b_u\) 的贡献。我们先钦定这些边都是向上的,即 \(v \to u\),接下来的问题就是从这些子节点中挑一些将其钦定为 \(u \to v\),使得总代价最小。调整一个点对于 \(a_u\) 的数量贡献是固定的,于是我们贪心地优先调整 \(f_{u, 1} - f_{u, v}\) 较小的点。

考虑记录所有的 \(b_u = b_v\)\(v\),将其按照 \(f_{u, 1} - f_{u, v}\) 从小到大排序,每次调整贡献并尝试更新。

特别地,考虑 \(f_{u, 0}\) 使 \(u\) 的出度加一,\(f_{u, 1}\) 使 \(u\) 的入度加一,这考虑的是边 \((u, fa_u)\) 被钦定的方向,如果 \(b_u \not= b_v\),那么 \(0/1\) 状态中只有一个会被使用。

\(T_u\) 表示 \(u\) 的子树,\(T0_u\) 表示被钦定为 \(v \to u\) 的点 \(v\) 的集合,\(T1_u\) 表示被钦定为 \(u \to v\) 的点 \(v\) 的集合(向上/向下连边的两个子节点集合),于是有以下形式化的转移:

\[f_{u, 0} = \min \left\{ \sum \limits_{v \in T0_u} f_{v, 0} + \sum \limits_{v \in T1_u} f_{v, 1} + \max \left\{|T0_u|, |T1_u| + \left[u \not= 1\right] \right\}\times a_u \right\} \]

\[f_{u, 1} = \min \left\{ \sum \limits_{v \in T0_u} f_{v, 0} + \sum \limits_{v \in T1_u} f_{v, 1} + \max \left\{|T0_u| + \left[u \not= 1\right], |T1_u|\right\}\times a_u \right\} \]

以上式子中的 \(\left[u \not= 1\right]\) 表示以 \(1\) 为根进行 DP 时,其没有父节点,也就不存在与父节点连边的那个度数。

\(\color{blueviolet}{CF1101F}\)

用到了一个奇妙 Trick。

对于每辆车可以考虑二分油箱容量,进行贪心验证,每次不能走了就加油,最后判断加油次数是否小于限制即可。

如果暴力二分是 \(nm\log V\) 的,不太能接受,发现其中有一些答案是无用的,比如前 \(i - 1\) 辆卡车的答案为 \(ans\),第 \(i\) 辆卡车在 \(ans\) 的情况下合法,我们就无需计算 \(i\) 的答案。

这样有了一些小剪枝,但发现当答案单调上升的时候复杂度仍然会卡到上界,考虑随机化优化一下。

有如下结论:对于长度为 \(n\) 的随机序列,前缀最大值的个数为 \(O(\log n)\)

证明是简单的。对于一个排名\(x\) 的数字,需要保证所有比它大的数字都要出现在其后面,则其为一个前缀最大值。我们将排名依次为 \(x, x + 1, \dots , n\) 的数字作为一个子序列拿出来,\(x\) 为前缀最大值的概率等价为 \(x\) 在这个子序列中是第一个数的概率,所以有其概率为 \(\frac{1}{n - x + 1}\)。期望个数即 \(\frac{1}{1} + \frac{1}{2} + \dots + \frac{1}{n}\),积分后可以得到是 \(O(\log n)\) 的。

所以我们对于每辆卡车随机赋权值,并按照权值排序,这样得到的前缀答案最大值期望个数为 \(O(\log m)\),所以总期望复杂度为 \(O(n \log m \log V + m\log V)\),可以接受。

CF 1913

ABC 上来没多久就都切了,冲 D 题。

感觉是个 DP,随便写了个,假了。

有点后效性在里面的,改了一下感觉差不多,需要一个三维偏序,写了个树套树。

调不出来发现多测清空有毛病,似了。

调出来之后发现假了,耻辱下播。

尾声

沉睡。

posted @ 2023-12-19 07:27  Eon_Sky  阅读(9)  评论(0编辑  收藏  举报