WC2022 Solution Set

我喜欢 $ 题,哕哕哕。

只找一天一节课听。

Day 1 直觉与证明

我直觉证明了个锤。

题太多不想补了。

CF1267G Game Relics

有一个可能太简单导致不好发现的结论,当前状态如果选择了随机抽,那么会随机抽直到抽到一个。

根据这天讲的 canonicalize(决策规范化),我们考虑将两个操作分开执行(可以用同样出处的 exchange argument 证明,交替执行的策略不会更优)。那么在先执行随机抽和先买中显然先随机抽更优秀(毕竟一开始抽中的概率会大一些,这是个直观的东西)。

然后是,我们要找到一个时间点,使得在之前我们选择随机抽,在之后直接买。定义 \(f_i\) 为选择了 \(i\) 个东西之后,再买一个随机的东西的期望花费。抽中没抽到的东西的概率是 \(\dfrac{n-i}{n}\),那么期望抽 \(\dfrac{n}{n-i}\) 次。那么 \(f_i = \dfrac{x}{2}\left( \dfrac{n}{n-i} -1 \right) + x\)。

注意到随机抽去买这个动作得到的东西我根本不知道,也无法操控。将随机抽归纳到直接买是不可行的。

Motivation: 将直接买这个操作,通过先随机抽再直接买这个性质,变成跟随机抽一个性质。

记没买的东西的总价值为 \(c\),还有 \(p\) 个没选。注意到在两个操作都是通过固定花费随机购买一个东西,那么每种购买顺序概率相同,当前如果直接买相当于期望花费 \(\dfrac{c}{p}\) 买一个随机的还没有的东西。

那么在确定了 \(c,p\) 的情况下,我们的最优决策固定,花费为 \(\min\left(f_{n-p},\dfrac{c}{p}\right)\)。

观察数据范围,猜测需要 \(O(n^2 \sum c_i)\) 的算法。因此我们可以求出选了 \(p\) 个东西总价格为 \(c\) 的方案数。

因为每种购买顺序概率已经相同了,可以求出 \(dp_{p,c}\) 表示选了 \(p\) 个东西总价格为 \(c\) 的概率,相当于方案数再除以 \(\dbinom{n}{p}\)。

那么最优的答案是 \(\displaystyle \sum_{i=0}^{n-1} C(i)\),其中 \(C(i)\) 表示在选择了 \(i\) 个东西之后再选择一个东西的最优期望花费。

显然 \(C(i)\) 也是个求和的形式。令 \(s = \sum c_i\),枚举剩下的东西的总价格 \(c\),那么 \(\displaystyle C(i) = \sum dp_{i,c} \cdot \min\left(f_i,\dfrac{s-c}{n-i}\right)\)。

Day 2 $ 题

原来是 $ 题!!!

IOI2021 Registers

\(s=0\) 的情况。对于 \(n\) 个数,我们比较 \((1,n/2+1),(2,n/2+2),\cdots\) 并将其赋值到 \(1,2,\cdots\) 上。这样就可以将 \(n\) 缩小一半,操作次数是 \(O(w \log n)\)(\(w\) 是缩小一半的操作次数)。

考虑如何比较两个数的大小(这种造计算机题要么不给比大小要么不给加法,生气)。若 \(a<b\),则 \(a-b<0\),此时注意到 \(a,b\) 是无符号整数。如果 \(a-b<0\),其符号位一定为 \(1\)。考虑用符号位判断。

注意到我们封装了加法,需要实现减法。那么 \(a-b = a+(\operatorname{not} b + 1)\)。再加一个常量求符号位,微调可以做到这一点。

然后是排序。注意到的是,一般的常用算法快排或者归并需要知道哪个位置是什么数,依赖之前的结果。显然我们的寄存器操作不支持做到这一点。那么考虑一些并行的排序算法,比如奇偶排序,这样做到的是奇数位和偶数位比较,需要完成相邻每个数的比较与交换,这个类似于上面的过程,只是 \(n=2\) 并且位置不同罢了。

还可以使用双调排序。

UOJ671 诡异操作

哕题。把除法中 \(v=1\) 的操作除去,每个数最多被除 \(O(\log a_i)\) 次,因此维护过程中我们需要考虑把除法这个操作看成对一个固定区间重构,考虑线段树。

然后是,这个除法要重构,一个好的想法是叶子存储的信息里面直接保存下来一个当前位置的值就好了。

显然对每一个 bit 考虑。共有 \(128\) 个 bit 位。一个结点中存下这 \(128\) 个 bit 位在这个区间里出现的次数 \(d_0,d_1,\cdots ,d_{127}\)。

注意到,假设这个区间长度为 \(l\),那么将所有 \(d\) 二进制展开,长度为 \(O(\log l)\)。这是一个 \(128 \times \log l\)(表示列乘行)的表。讨厌的是我们的区间长度可能并不是 \(2^k\) 的形式,我们将 \(n\) 补至 \(2^k\) 即可。

但是这样还是很烦……注意到我们之前做的是把行缩成一个值,不如这次把列缩成一个值。这样变成一个 \(1 \times \log l\) 的表,每个数都是 \(128\) 位的数。与操作支持打标记,对于一个结点的直接修改可以直接将表与上修改值。查询类似于二进制加法,直接算。

时间复杂度 \(O(n \log a_i+q\log^2 n)\)。

UOJ592 新年的聚会

有一个我不知道怎么证的结论是,一个有 \(m\) 条边的图,可以划分成 \(O(\sqrt m)\) 个独立集。

那就直接分了……$ 哥哥告诉我们 \(5\times 10^4 ≈ O(m \log n), 10^6 ≈ O(n \sqrt m)\)。拿出 \(O(\sqrt m)\) 似乎也是合理的。

那么,求独立集是个很简单的事情。我们维护每个独立集,看一下这个点能否加进去某一个,不行就再加一个就好了。

然后是处理独立集与独立集之间的边。两个独立集 \(S,T\) 之间如果有边,假设 \(|S|\geq |T|\),将 \(S\) 尽量均匀划分成两块,如果有边相连就向下递归直到 \(|S|=|T|=1\) 即可。

UOJ604 赶路

显然有解。求出凸包,分类讨论。但是我不会凸包,怎么办啊!!1

考虑分治。有函数 \(\operatorname{Solve}(s,t,S)\) 表示找到一个路径 \(s \to t\) 并经过且只经过 \(S\) 里面的所有点。这个随便搞。

其实是我不会哈哈hhhhhhh。

CF566C Logistical Questions

需要证明一个结论是,答案类似于凸函数,大概是说以答案的结点为根的树,父亲的答案总不劣于儿子的答案。

有想法是,随机一些边,找到两个点计算答案。把不优的那一边删掉,但是还是不能保证复杂度。

那么保证不优的那一边至少是当前树大小的一半就好了。不难想到重心,选一个优秀的,用类似点分治的过程。

但是不妙的是我们不可能对每一个子结点都算一遍答案。考虑求导,找导数小于 \(0\) 的那一边走过去就好了。

Day 3 邓题

节目效果非常好,感谢 ccf,感谢邓老师。

AGC044E Random Pawn

luogu 刚好到这场 AGC 就不爬了,生气。

显然如果到了 \(a_i\) 最大的位置就不会再走,破环成链,重复一遍最大值。

注意到每个 \(f_i\) 都有 \(f_i = \max\left(a_i,\dfrac{(f_{i-1}+f_{i+1})}{2}-b_i\right)\) 这样的表达,想到 USACO Balance Beam 一题,只不过带了个 \(b_i\) 这种恶心东西。

考虑将 \(a_i\) 减去 \(b_i\),然后对每个 \(f_i\) 加上一个系数 \(c_i\),就可以消去 \(\max\) 表达式里面的 \(c_i\)。

\(c_i\) 的求法是,钦定 \(c_1=0\),剩下的是一堆可解的方程。不想多讲。

那么 \(f_i = \max\left(a'_i,\dfrac{(f_{i-1}+f_{i+1})}{2}\right)\)。画出 \((i,f_i)\) 的所有点。

WC2022 Solution Set

不言而喻一目了然。求出凸包算多个梯形面积就好了。注意有 \(c_i\) 系数的存在。

Od deski do deski

就是那个砍树从世界上消失那个题。

注意到 \(n\) 棵树最多用 \(n\) 个颜色……所以定义可以转成 \(n\) 二维相关。

定义 \(f_{i,j},g_{i,j}\) 分别表示前 \(i\) 个用了 \(j\) 个颜色,并且方案合法或不合法的方案。合法的方案只可能加入之前出现过的颜色并且一定可行,不合法的方案分情况讨论是加入新颜色还是不加入,转移。答案也很显然。

上一篇:线性回归【机器学习笔记简摘】


下一篇:分类任务评价指标(Accuracy / Precision / Recall / F1 / ROC / AUC)