【笔记】非传统题 2025.8.5
【笔记】非传统题 2025.8.5
QOJ-9237 Message
在 \(S\) 后面加一个 1 和 \(1025-|S|-1\) 个 0,这样信息的长度可以固定为 \(1025\) 了。我们只剩 \(31\) bits 传递 \(C\) 数组。
考虑在 \(C\) 数组上的每个 0 向下一个 0(将它当作环)连边,剩下的 1 让 Cleopatra 随便连接。这样就会出现一个长度为 \(16\) 的大环的基环树森林。由于这样的环是唯一的,我们将边的信息传递过去。
我们传递边的长度,在第 \(i\) 列传递 00...001 这样长度为 \(nxt_i-i\) 的信息,一共 \(31\) bits,这样 Basma 就能通过寻找长度为 \(16\) 的环确定 \(C\) 数组。剩下可用的位刚好能传递完 \(S\)。
QOJ-8642 Spy 3
我们不需要把边权传过去,我们只需要传最短路树(但也不能全传)。例如,如果我们知道从 \(0\) 到 \(u\) 需要经过哪些隐藏边,我们将这些边的边权设为 \(0\) 跑最短路就行了。在原图的最短路树上考虑,每条隐藏边会覆盖它子树里面的点的最短路。
@persistentlife QOJ-8642 Spy 3 这题,为什么,从0到某个点的最短路上的隐藏边,将它们的边权改为0后,最短路仍然正确?这样不会使得有部分实际最短路更长的点被错误地接了上去吗?
答:因为你已经知道经过哪些边了,你钦定这些边一定会被经过,然后最短的一个就是最短路。因为所有的最短路中,一定有一条被扣减的权值最多,那么它还是最短路;反之,一条不是最短路的,扣的没有这条路径多,那么也不是新的最短路。
我们将询问点拉出来建虚树(\(\leq 31\) 个点),然后只需要把隐藏边覆盖的子树对应的点传过去,这里一共 \(300\times \log_2 31=1500\) bits。
现在问题变成将 \(\leq 31\) 个点的树传递过去,我们对它三度化变成 \(31\) 个点的二叉树,这样前面的部分不受影响。然后考虑按照二叉树点编号顺序传递二叉树,让对方增量构造,第 \(i\) 次时将第 \(i\) 个点插入到 \(a_i\) 号点与父亲的边的中间(也就是在这条边中间开一个点,第 \(i\) 个点连到这个点上)。这样就非常好了。信息量是 \(1\times 3\times 5\times \cdots\times 31\),因为一次插入就多两个点,也就是 \(31\) 的双阶乘,它竟然小于 \(2^{60}\),可以在 60 bits 内传递,于是本题完成。
QOJ-8745 采矿
如何判定一个点是否是叶子,以及它的父亲边编号和父亲?做完这个问题整道题就差不多了。
考虑随机询问,在 \(Q=50\) 次询问中,对于一条边,有 \(Q/2\) 次是 0,另外 \(Q/2\) 次是 1。这样,如果一个点是叶子,那么这 \(Q\) 次询问就肯定是 \(Q/2\) 次 \(=1\),\(Q/2\) 次 \(>1\)。其它不是叶子的点很难被判为叶子,因为所有边的方向都是随机的,有多于一条边控制这个点就很难达到叶子的判定条件。那么这个叶子的父亲边编号,只需要看它 \(=1\) 的时刻是否和这条边为 0 或 1 的时刻完全相同(这也是唯一的,因为随机),父亲点编号,就是看当这条边是父亲到叶子(\(v\) 到 \(u\))的方向时,\(f_u=f_v+1\) 是否总是成立(\(f\) 就是返回值数组),这几乎很难出错。这样就确定了这个叶子的所有信息,删掉它就可以继续做了。
注意我们的算法流程是先一次性问完 \(Q\) 次询问再去剥叶子,是一个离线的过程。复杂度是 \(O(n^2)\) 的,据说需要卡常。
UniversalOJ-751 神隐
考虑二进制分组,第 \(2i-1\) 次询问将边的编号的二进制第 \(i\) 位为 1 的隐藏,第 \(2i\) 次询问将边的编号的二进制第 \(i\) 位为 0 的隐藏。这样,一条边会有一半的询问中会出现,提出结论:如果所有询问中 \(u,v\) 恰好有一半的询问是连通的,当且仅当就说明有一条边是 \((u,v)\)。前者推到后者显然,后者推到前者只需考虑到它们不直接连通时,这些边的出现时间集合(大小都是询问次数一半 \(Q/2\))的交一定 \(<Q/2\)。
这样,\(Q\) 还是太大了。考虑优化:重新分配编号,取出 \([0,2^T)\) 中所有 popcount 为 \(T/2\) 的数,给每个点分配编号。然后询问的时候,第 \(i\) 次询问将边的编号的二进制第 \(i\) 位为 1 的隐藏,就可以了。这对刚才的结论不产生任何影响。取 \(T=20\) 就刚好完成。
大概就是这样的过程。需要优化复杂度中 \(n\) 的指数。考虑剥叶子,这个部分很简单(有一半询问孤立就是叶子),这样可以把所有叶子删完,得到每个点的深度。然后再还原整棵树,考虑每个叶子的父亲,一个点在另外一半不是孤立点时候的询问所在的连通块,一定包含了它的父亲。也容易说明这些连通块的交集中只有它的父亲。此时只要做树上 \(\log_2 n\) 个集合的交,其必定是其中一个集合顶部(深度最小的点),如果交唯一,一定是这些顶部深度最大的那个点。求交可能是暴力。
[YDRG #005] 欢天喜地贺元宵 · 云斗二月 Golden Round F. Z 老师的天才 Mahjong 挑战赛
Z 老师的天才 Mahjong 挑战赛! - 题目详情 - 云斗学院
设计一个对每个牌的估价函数,注意要统一量纲,然后按照这个估价函数问。这样过不了,改成询问使得所有牌估价减少最多的牌,即可。大概是这样。
QOJ-7281 How to Avoid Disqualification in 75 Easy Steps
等价于构造 \(n=1000\) 个 \([0,2^d)\) 的数 \(a_i\) 使得对于任意 \(1\leq i\leq j\leq n\) 都有 \(a_i|a_j\) 两两不同。这个问题其实非常困难,我们考虑随机化。例如,我们使每个 bit 都有 \(p\) 的概率为 \(1\),填出来的数列有 \(p(1-p)^2\) 的概率不合法(不知道为什么,有可能反了),求导得到取 \(p=\frac13\),所以我们提取所有 popcount \(\in [8,11]\) 的数,然后从小往大增量加入,能加入就加入,这样能搞出九百多个数(据说)。然后需要一些扰动:
- 合法时以 \(99\%\) 概率加入,剩余可选的数再加一次
- 退火、模拟退火
- 收敛的时候加大扰动,删掉更多的点
有个东西:维护一个序列,支持尾插和随机取数(取的同时删掉)。使用折半警报器,尾插正常插,删数时打删除标记,并检查如果当前被删的数超过一半就重构,这样取数的时候期望 \(2\) 次就能取出来数。
QOJ-6669 Mapa / 映射
拉格朗日插值,把系数传过去就可以了。注意要选一个模数。
QOJ-67 Two Transportations
两边一起做 dijkstra,共享信息。松弛就自己各自做,从堆中弹出最小值时,两边交换自己的最小距离,然后距离小的一方把自己的最小距离点编号传过去,这样就可以了。注意到交换距离的时候直接交换是 \(O(nw)\) 的,但明显可以传递当前距离减去上一次距离的值,这样就肯定只有 \(O(w)\)。一次松弛 \(2\log_2w+\log_2 n=29\),刚好 \(58000\) bits。
QOJ-6774 Ancient Machine 2
已知前 \(i-1\) 位求第 \(i\) 位:先吃掉前 \(i-1\) 位,然后做一个分支,分支后连自环。
已知后 \(i-1\) 位求倒数第 \(i\) 位:假定倒数第 \(i\) 位为 0,构造 KMP 自动机,观察是否匹配。
中间的 \(1000-2m\) 位:解方程。一个方程这样构造:参数 \(x>y\geq 0\),连两个长度为 \(x\) 的环,环上所有点无条件连向下一个点,除了两个环的第 \(y\) 个点,接受 \(0\) 时连向自己环的下一个点,接受 \(1\) 时连向对面环的下一个点。最后看结果在那个环里,就知道 \(\equiv y\pmod x\) 的所有位置的值的和的奇偶性。这样就出现了一个方程。我们拿出所有方程,用线性基强行求出一个满秩的方程组,提交上去让它跑就行了。
QOJ-118 Road Service
基本的思路是去连菊花,连不止一个菊花,这样 \(dist(u,v)\) 就能被 \(dist(u,x)+dist(v,x)+2\) 估计,其中 \(x\) 是某个菊花的叶子。然后就用随机化算法扰动。1. 概率采样;2. Beam search。有很多很多方案,包括研究 AI 的方法也能搬过来,想怎么搞就怎么搞,大概就这样了。
QOJ-3098 Ancient Machine
- 第一个 X 和最后一个 Z 之外的所有位置没有用。
- 由相同字符组成的一个连续段只有一个有用。
- 答案就是 Y 的数量。这个可以“随便”构造?
通信部分,需要传最左边的 X 和所有 Z。注意到连续的 Z 只需要保留一个,所以所有的 Z 可以搞成不相邻的,这就是斐波那契数,我们分段用斐波那契数的方法把它压缩起来。大概就这样。
试机
- 厕所位置
- 志愿者
- 硬件:键盘(每个键敲一遍)、鼠标、测速(1s 内取模次数)
- 软件:OJ(UB / WA、RE / MLE、提交方式、样例下载)
- 检查多余的电子设备
比赛
- 不要预假设题目、分数、分数线
- 不要立 flag
- 不要死磕(每个题都做)
- 时间安排:1. 暴力,看着时间写;2. 不要最后拍;3. selfEval 相对可信,该拍去拍,用手段测试强度,注意次数
训练
能力维度:代码、思维。代码和思维差不多时,提升代码。定位方法:模拟赛。
训练用题:选择性选择模拟赛
自己找题:cf、at、vjudge、qoj、acmicpc.net;XCPC 题:ucup、ocpc、ptz
出题人选择:
- 不认识,rating>=我+100
- 认识,黑白名单
例外:coodinator 的黑白名单
CF 选题:R+200 ~ R+400
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/19026007
浙公网安备 33010602011771号