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\) 也要区分。嗯嗯。

指令太困难了。

posted @ 2026-04-03 14:40  Just_int_mian  阅读(59)  评论(1)    收藏  举报