thusc2021
Day2
题目很有意思,虽然名义上是考的光线追踪,但是更多考察的是简单的数学和简单的代码实现。所以可能要让自己更快适应他给的工具和信息。
最后没写出来直接光采样以及后面的东西,然后路径追踪的系数好像有点问题。晚上看一看 sol。不过其实看 sol 意义也不是很大。但是玩得还是挺开心的。
Day1
A
\(n\) 个物品有重量,有一个箱子大小是 \(m\),你按照如下策略装箱:在最大化本次装箱物品数的前提下,最大化字典序。
问要装箱多少次。
\(n\le 50000\)。
签到题。
只需要使用值域线段树,我们就会求出 \(\le x\) 的箱子最多能装多少个东西。我们每次装箱,都先求一遍这个,然后按字典序顺序去除物品,check 是否还能装下,以此决定是否真的装这个物品。
当然这样有点烂,我们每次二分求出当前情况下,最大能装一个多大的物品,然后求满足这个重量条件的,字典序最大的物品,装进去。
复杂度 2 log,可能会写一下代码。
B
\(n\) 个点的树,点有点权,让你选一条链,使得这个链上的 LIS 最长。
\(n\le 10^5\)。
问题问得感觉很经典。
我随机枚举了第一个做法好像就可以做了。
路径问题你考虑上点分。然后相当于有一个端点固定了,每条从根开始/结束的路径可以表示成 \((tp,val,len)\),更新就是找一个 \(tp=0,tp=1\) 的,要求 \(val_1<val_2\),然后用 \(len_1+len_2\) 更新。这个显然可以枚举 \(val_2\),然后找最大的 \(len_1\) 非常简单不说了。
怎么求这些路径呢?你发现你其实不关心它另一头在哪,你只关心它靠近根的这个头是谁。所以你就 dfs 的时候从下往上更新,用一个树状数组啥的维护一下就行了。额不对得线段树合并。常数好像挺大的,所以开了 1e5。
C
给你一个 \(n\times m\) 的矩阵,你可以选择要不要选每一列。选择完之后,对于每一行而言,如果这一行已选择的列没有 \(-1\),那就会产生这些数的和的贡献,否则没有贡献。你要最大化贡献。
\(n\le 20,m\le 10^6\)。
这个显然要在 \(n\) 上做文章。最简单的考虑方法就是,你直接枚举哪些人产生了贡献,然后把所有能选的列都选了。
换言之,你要对每个 \(x\),询问 \(\sum_{j=1}^m[val_j\cap x=\varnothing]sum_j\)。
而 \([x\cap y=\varnothing]=[x\subseteq\overline{y}]\),所以我们 FMT 就可以了。
当然,类似地你可以写一个容斥的式子出来,然后发现预处理一些东西就可以做到同样复杂度。
* D
通信题。
给一棵 \(n\) 个点有根树,你可以传递 \(128\) 位信息,来恢复出来。只要恢复的树与输入同构即可。
\(n\le 70\)。
不会。只会括号序列的 40 pts,烂完了。
阅读了 sol。
你发现括号序列其实已经很少了,只有 \(C_{70}\) 个,已经够用了。所以我们想办法编码括号序列就行了。
最简单的方法就是用字典序,那其实就没啥好说的了。

浙公网安备 33010602011771号