UOJ Round 补完计划。和别的什么东西?大概吧。
和 CTT 板刷同步进行。待补。
伊卡洛斯。路西法。
和别的什么东西?大概吧。
我应当于 4/30 前阅读完 https://www.luogu.com.cn/article/o9mj50m1 。
谨遵指令之意。
It's too cold
Standing in the middle of the downfall
Looking in the mirror cuz it's only you
一安在? / Gdzie jest jedynka? 2(已过)
题意:有一个隐藏的,从 \(0\sim n-1\) 的排列 \(p\)。每次可以询问 \(\gcd(p_i,p_j)(i\neq j)\),定义 \(\gcd(0,a)=\gcd(a,0)=0\)。要求在至多 \(\lceil \frac{5n}{2} \rceil\) 次询问后返回 \(1\) 的位置。保证 \(n\geq 3\)。
\(1\) 的性质不好,\(0\) 的性质好。考虑找 \(0\)。
对于这种一开始什么都不知道的交互题,可以先找一个 \(x\),询问所有 \((x,i)\)。
- 如果全部都是 \(1\)。
说明当前这个数就是 \(1\)。 - 如果询问出一个 \(1\sim n-1\) 的排列。
当前这个数是 \(0\)。 - 其它情况。
\(p_x\) 一定为询问最大值。将所有得到询问最大值的下标放进集合 \(S\) 里。这个集合里的任意数,要么是 \(p_x\) 的倍数,要么是 \(0\)。
现在,只需要处理这个其它情况了。这个 \(S\) 就是现在所有的 \(0\) 的候选位置,它的大小一定减半了。于是直接对着它再递归!当然你会注意到,\(1\) 一定不在这个 \(S\) 里,并且我们不能靠原来的方法判 \(0\) 了。事实上,我可能出现一个数(即 \(S\) 里的最大值),它问出来的集合和 \(0\) 是一样的,所以我还不能用上面的方法判 \(0\) 了。于是就直接递归直到出现以下两种终止状态之一。
-
\(S\) 的大小为 \(1\)。
这个数一定是 \(0\) 了!拿着它去第一轮被排掉的数里到处问就可以了。
-
\(S\) 的大小为 \(2\)。
光靠这两个数,啥都不能区分,只知道里面有一个 \(0\) 和一个神秘数字。不过我只需要知道 \(1\) 的位置。
假设这两个数是 \(x\) 和 \(y\)。先拿着 \(x\) 到处问。问出来不是 \(1\) 就不用管。问出来是 \(1\),就再用 \(y\) 确认一下。如果 \(y\) 问出来也是 \(1\),那么这个数肯定就是 \(1\)。否则的话,我就知道 \(x\) 绝对不是 \(0\) 了。于是 \(y\) 就是 \(0\)。然后拿着 \(y\) 到处问就行了。
可以看出来操作次数大概是 \(\frac{5n}{2}\) 的。具体分析的话。不想分析了。我现在很生气。
UPD:我发现实现不当好像会死循环。假如我在递归的时候,把我用来询问的那个数放进去了。它可能是一个非 \(0\) 最小值,然后啥都不会变。我之前就是这样写的。不过这貌似不太重要,稍微改改就过了。
P9323 [EGOI 2022] Toy Design / 玩具设计
我们进行一个观察。又是最开始啥都不知道的题。所以要找一个点一直问。
有两种问法:
- 用 \(x\) 在原版本上一直问。可以问出哪些和 \(x\) 连通。
- 用 \(x\) 在加边的版本上一直问。可以问出连通块数量,还有每个连通块中的一个数。
完了我不会,看题解吧。
事实上,问法二稍微有点用处。我们可以问出 \(1\sim i\) 中的关键点,它们让 \(1\) 的连通块大小增加了。
于是,对于点 \(i\) 的加入,如果它是关键点的话,我们直接记录特殊记录它的历史版本,称其为关键历史版本。
否则,可以通过二分查找,找出使点 \(i\) 和点 \(1\) 连通的第一个关键历史版本,其对应的关键点在原图上就一定与点 \(i\) 连通。
操作次数约为 \(\sum\limits_{i=1}^n \log_2 i\)。
P9793 [NERC 2018] Cactus Search(已过)
树上的做法很显然。每次问重心,做一个类似点分治的东西就可以了。
仙人掌怎么做???
有结论:每次询问一个让候选点集最小的点,候选点集大小最少除以 \(2\)。我不会证明。
这很显然!!!
我们考虑选择一个环或者点,使得删掉它过后,剩余的连通块大小最小。(如果一个点在环上,它就只可能作为环的一部分被选中。)
然后仔细想一下,发现好像是有一点点对的?
这个题没有什么价值。
P11403 [RMI 2020] 软盘 / Floppy(已过)
我们组居然做出来了一道蓝色的通信题!!!
注意到只需要求最大值位置。于是考虑笛卡尔树。
注意到要求 \(L\leq 2N\)。发现知道括号序就可以还原笛卡尔树!!!
于是就做完了。还是不难的。
UPD:这是错的!!!乱说!!!括号序根本就不能确定只有一个子树时到底是左子树还是右子树!!!直接记录建笛卡尔树时的入栈出栈情况就可以了!!!这很显然!!!
P7595 「EZEC-8」猜树
这也太困难了。
P7971 [KSN2021] Colouring Balls(已过)
这个题非常的简单!我没有看题解就做出来了!!!!!
不过我最开始没发现它是一个拼盘题。
不过拼盘也很简单就是了。
P7135 小 B 的面包
可以把原问题放在幻方上考虑。然后发现是一个井字棋。
于是我需要实现一个程序,满足在 \(600\) 局我先手,\(1200\) 局交互库先手,且交互库随机出招的井字棋游戏中拿到总共 \(>90\%\) 的胜率(不算平局)。这个怎么做?????
P14936 「FAOI-R10」别样的 mex 大战
别问我为啥做黄题。
先求出原序列 \(\text{MEX}\)。然后求出原序列 \(\text{XOR}\)。然后加数 \(\text{MEX}\oplus\text{XOR}\)。
- 过了。
这是好的。 - 没过。
说明 \(\text{MEX}\oplus \text{XOR}=\text{MEX}\),即 \(\text{XOR}=0\)。
然后一定能构造出 \(a,b\),满足这两个数都不等于 \(\text{MEX}\),且异或和为 \(\text{XOR}\)。因此 \(k\leq 2\)。发现这种情况 \(k\) 不可能为 \(1\)。于是做完了。
P15369 『ICerOI Round 1』并非图论
好题啊。首先对权值进行转化。将 \(i\times d(i)\) 放在边上,得到这个生成树的权值其实是 \(\sum u\operatorname{OR} v\)。于是我们要求一个 MST。
考虑用最简单的建树方式直接做,将 \(i\) 往 \([l,i)\) 连一条边。因为 \(i\operatorname{OR}x \geq i\),所以我们想让 \(x\) 尽量包含在 \(i\) 内。又因为 \(x\) 必须大于等于 \(l\),所以我们想让 \(x\) 尽量大。因此我们第一个尝试的数应当是 \(i-\operatorname{lowbit}(i)\),设其为 \(u\)。
- 若 \(u>l\)。
代价加上 \(i\),\(l\) 最小度数不变。 - 若 \(u=l\)。
代价加上 \(i\),\(l\) 最小度数 \(+1\)。 - 若 \(u<l\)。
代价加上 \(i\operatorname{OR}l\),\(l\) 最小度数 \(+1\)。
分讨过后随便统计一下就做完了吧。
P15388 引航罗盘 / luopan
???
P15882 [ICPC 2026 NAC] Heist of the Century
有一点巧妙。
\(N,2N,4N\) 这些界都是有用的。
想要知道 \(h_i\),可以询问 \(d0\) 和 \(d1\),满足当 \(j=i\) 时,\(d0_j=1\),\(d1_j=2N\),否则 \(d0_j=d1_j=N\)。
通过询问 \(d0\),我们能得到 \(\max(|h_i-1|,\max\limits_{j\neq i}|N-h_j|)\)。
通过询问 \(d1\),我们能得到 \(\max(|h_i-2N|,\max\limits_{j\neq i}|N-h_j|)\)。
发现后面这个东西是 \(\leq N\)。所以若 \(h_i\notin \{N,N+1\}\),我们都可以得到其具体值。这里只需要 \(2N\) 次操作。
而区分 \(N\) 和 \(N+1\) 也是简单的,我不太想写了。
还是写一下吧。在确定的位置直接询问 \(h_i\),在其它不确定的位置询问 \(N\),在我们想要通过这次询问确定的位置询问 \(1\)。这样的话,其它位置顶多带来 \(1\) 的贡献。而我们想知道的位置至少带来 \(N-1\) 的贡献,至多带来 \(N\) 的贡献。当 \(N=1\) 时,特判一下。否则可以直接确定。因为当 \(N\geq 2\) 时,\(N-1\geq 1\)。
总共大概 \(3N\) 次操作。好题啊。
P12120 [NordicOI 2025] 时之预言 / Xoracle
这是哪门子交互题。
发现只要问的询问构成一棵树,就能够确定任意一对节点度数的异或值。
于是询问所有 \((1,i)\),想知道 \((x,y)\) 直接算 \((1,x)\oplus(1,y)\) 就行了。
那么这个怎么做呢?容易发现本质不同的度数最多只有 \(O(\sqrt n)\) 种。所以本质不同的问出来的答案也只有 \(O(\sqrt n)\) 种。直接枚举 \(deg_1\) 加个桶就可以做到 \(O(n\sqrt n)\)。
更好的做法:发现一棵树中必定有度数为 \(1\) 的点,说明要么 \(deg_1\) 是 \(1\),要么存在一个 \(deg_i\) 是 \(1\)。若此时 \(deg_1\oplus deg_i\) 为 \(ans_i\),那么就说明 \(deg_1=ans_i\oplus deg_i=ans_i\oplus 1\)。于是此时 \(deg_1\) 一定是某个询问答案异或上 \(1\)。我们需要枚举的 \(deg_1\) 也就只要 \(O(\sqrt n)\) 种了。于是总时间复杂度 \(O(n)\)。
P12552 [UOI 2024] Points on a Line
我有一个做法,但是它是错的。但是它实际上是对的。
首先随机取三个点 \((a,b,c)\)。询问 \(c\) 在不在 \((a,b)\) 里。(这里没有说区间的意思。)如果在,就很好。否则的话,询问 \(b\) 在不在 \((a,c)\) 里,如果是,就能把 \(b\) 给删掉。否则保留 \((b,c)\)。一直做直到确定最大区间。
直观来看,第一次问出答案的概率,是在 \(a\leq b\leq c\) 中问出 \(b\) 在 \((a,c)\) 里或者 \(b\) 在 \((c,a)\) 里的概率。这是 \(\frac{1}{3}\)。于是删掉一个数的期望询问次数就应该是 \(\frac{1}{3}\times 1+\frac{2}{3}\times 2=\frac{5}{3}\)。
但是题解说这是对的。(因为交互库非自适应。)
因为一个均匀随机排列的严格前缀最大值个数期望为 \(O(\log n)\) 个。
如果不是排列的话,这个期望应该会更低吧。
好像很对啊。
P11978 [KTSC 2021] 铁路 / railroad
一个通信题。
首先,原图是一棵树。要标记一个特殊点。那么首先想到选择一个根节点,然后呢?如何判断一条边是不是新边?
发现,我们可以让新边满足 \(dep_u=dep_v\)。这样并不会改变接到新图的人算出来的 \(dis\),并且他还可以轻松判断。于是就做完了。发现如果是一条链,我们取链头为根无法构造出 \(\lceil\frac{N}{2}\rceil-1\) 条这样的边。于是考虑以直径中点为根。然后就做完了。
P9721 [EC Final 2022] Inversion
比较简单的交互题。和什么求区间逆序对的分块差不多吧。
先问 \([l,r-1]\),再问 \([l,r]\),异或一下得到 \(\text{cnt}_{>}([l,r-1],r)\) 奇偶性。
先问 \([l+1,r-1]\),再问 \([l+1,r]\),异或一下得到 \(\text{cnt}_{>}([l+1,r-1],r)\) 奇偶性。
把这两个异或一下得到 \([l>r]\)。发现询问两个位置的大小关系,居然只需要 \(O(1)\) 次操作。
套个好点的排序做完了。
UOJ Round #30 A. 赛场设计
处于“未看题解”姿态。
hey,bro.
这是一个 DAG。三个点不能互相不能到达。于是一旦这个 DAG 存在三个,入度为 \(0\) 的点,就寄了。
我的题意转化错了!!!再想一想吧。
我们发现,对于任意三个点,都需要其中一个点能到达另外两个点,或者另外两个点能到达其中一个点。
UPD:没看题解过了。这个题非常的简单啊!!!
UOJ Round #25 A. 设计草图
我们猜测。一个序列合法的充要条件是:把 ( 看成 \(1\),? 看成 \(0\),) 看成 \(-1\),它的前缀和都 \(\geq 0\),并且它的后缀和都 \(\leq 0\)。
发现一件酷炫的事情:可以设 \(p_i\) 表示以 \(i\) 为左端点,只考虑前缀和最远能延伸到哪。同理,设 \(q_i\) 表示以 \(i\) 为右端点,只考虑后缀和最远能延伸到哪。于是 \((l,r)\) 合法,当且仅当:
- \(l\geq q_r\)。
- \(r\leq p_l\)。
- \(r-l+1\equiv 0\pmod 2\)。
这是一个二维偏序,可以轻松地做到 \(O(n\log n)\)。
那么 \(p,q\) 怎么求呢?一个线段树上二分就做完了。
UPD:不是怎么和题解相似度这么高。
谨遵指令之意
括号序列相关
- CF1458D。
Flip/Reverse 考虑 \(+1/-1\) 转化,计算前缀和数组 \(a\)。发现原操作是选择 \([l,r]\) 满足 \(a_{l-1}=a_r\),将 \(a[l,\cdots,r]\) 进行一个 Reverse。
这非常不友好地启示我们建图。值为点,连形如 \((a_i,a_{i+1})\) 的边。然后这个 Reverse+Flip 操作其实就是在翻转一个环。所以我们可以把有向边都看成无向边,然后从 \(0\) 开始走,走到 \(a_n\) 的一条字典序最小的欧拉路径就是答案。证明可以看题解,需要注意到这个操作是可逆的,这样证起来就会容易很多。
- CF1685C
诶定睛一看发现这不是我们猪猪侠再战括号序列吗。
构造操作次数 \(\leq n\) 的方案是非常容易的。
关键 Observation:操作次数最多为 \(2\)。为啥呢。画出折线图,设翻转了 \([l,r]\) 的折线,这其实是把这个折线沿 \((\frac{l+r}{2},\frac{a_l+a_r}{2})\) 进行了中心对称。我们想让中间的点纵坐标都 \(\geq 0\)。这要求了 \(i\in [l,r]\) 均满足 \(a_i\leq a_l+a_r\)。
于是我们可以使用两次操作,让整个折线图都不在横轴下方。找到最后一个最大值的位置 \(pos\),翻转 \([1,pos]\) 和 \([pos+1,n]\) 就显然是对的。
使用零次当然是很显然的!
一次怎么判?
找到编号最小的 \(<0\) 的前缀 \(l\)。找到编号最大的 \(<0\) 的前缀 \(r\)。翻转的区间显然要包含 \([l,r]\)。于是左边直接选到前缀和最大的,右边直接选到前缀和最大的,然后就做完了。时间复杂度 \(O(n)\)。
这里没写清楚折线图上的点和括号的对应关系,翻转的下标可能还要处理一下。
还有 \(n\) 和 \(2n\) 也要区分。嗯嗯。
指令太困难了。

浙公网安备 33010602011771号