ucup 随机记录

这场打得不错,就记录一下做的题吧,以及随便估个难度。

  • 11.9

E. Left Shifting 3 (*800)

签中签,不难发现循环位移的作用只有把原本序列的一段后缀和前缀能形成的 nanjing 拼上,所以移动不超过 77 位,具体实现时开大一点保险。

G. Binary Tree (*1600)

由于只有 logn\log n 次操作,于是方向就是能否每次确定关键点在一个大小至多 n2\frac n2 的子树内。想到找重心。考虑询问重心的两个儿子 x,yx,y,若返回 00 则在 xx 的子树中,若为 22 则在 yy,否则在整棵树去掉 x,yx,y 的子树中。

由于是二叉树,所以最后一种情况剩下的树大小为子树大小 +1+1。注意当 siz=n2siz=\frac n2 时会寄,所以一定要将 siz=n2siz=\frac n2 的子树放在 xxyy 的位置。以及要特判当前度数为 11 的情况。

感觉做这题时状态极好,居然一发了。

B. Birthday Gift (*1800)

一开始的想法是先把能做的都做了,然后剩下的再处理。然后发现处理剩下那一部分也是困难的。怎么办?手玩一下,发现这个两个相邻的相同的一起消掉,这样的形式实际上不太好。

突然对上脑电波发现可以套路地奇数位反转,然后变成每次选相邻的不同的消掉。这样就之和 0,10,1 数量有关了。后面的就简单了。

yhd 说他认为这题很困难,事实上我也真忘了是怎么想到奇数位翻转的。

C. Topology (*2400)

被硬控了/ll 首先求拓扑序方案是简单的。考虑怎么确定一个点排名。设 dpu,idp_{u,i} 表示已经处理完了除了 uu 子树内的所有点以及 uu,当前 uu 的排名为 ii 的方案数。考虑如何转移,设 vvuu 的儿子,则先要插入所有除了 vv 之外的 uu 的儿子的子树,方案数为这些子树的拓扑序数量乘上一个组合数,前者可以预处理。

设这些方案数为 w(u,v)w(u,v),则转移为 dpv,j=i<jdpu,i×w(u,v)dp_{v,j}=\sum_{i<j}dp_{u,i}\times w(u,v)。显然可以前缀和做到 O(n2)O(n^2)

树形 dp 严重占模。

  • 11.16

F. The Hermit (*1700)

考虑对每一个 iiii 被删掉的贡献。若 ii 被删掉,则 j<i\forall j<i 也要被删掉,并且剩下的数必须全部是 ii 的倍数。对于第一个条件,发现把被删掉的 j<ij<i 放进序列 ama_m 中,从小到大排序,则一定有 aiai+1a_i|a_{i+1},于是 mO(logn)m\le O(\log n)。于是预处理 fi,jf_{i,j} 表示当前 aa 的长度为 jjaj=ia_j=i 的方案数。枚举 ii 的倍数转移,复杂度 O(nlognlnn)O(n\log n\ln n)

考虑如何统计答案,先枚举 iiaa 的长度 jj,则 >i>iii 的倍数有 ni1\left\lfloor\frac ni\right\rfloor-1 个,其中要选 mjm-j 个,乘上个组合数即可。

B. The Magician (*1200)

弱智题,一开始没几个人过的原因大概是题面过长。考虑先只用前四种牌,暴力搜索最后每种花色有多少个,合法的条件是 ci=cicici+ai×3\sum c_i=\sum c_i'\wedge c_i'\le c_i+a_i\times 3cic_i 是该花色数量,aia_i 是是否有这种牌。然后考虑剩下两种,本质上都是将一种花色转化为其他任意一种,暴力 444^4 枚举即可。

E. The Chariot (*1500)

大粪分讨。首先大致的策略就是三种:每次都坐 XX,每次坐 X+YX+Y,坐完 X+YX+Y 后一直坐。只需要对最后一段进行分讨,因为有时候最后可能不重新坐车而是直接坐到终点更优。细节不想写了。

D. The Emperor (*2300)

挺有意思的题。考虑一个函数 solve(i)solve(i),返回值为一个 pair (x,y)(x,y)xx 表示进行完操作 ii 的 push aa 之后,把 aa pop 的操作进行完后到的操作。yy 表示这其中经过了多少次操作。

考虑如何求 solve(i)solve(i)。首先考虑 push aa 之后到的操作,如果这一步直接可以 pop aa 就结束了,否则若 push 一个 bb,那显然先要把 bb pop 出来再考虑下一个操作是否是 pop aa。这样不断跳直到找到一个 pop aa 的操作。注意到若有一个 bb 出现多余一次,说明这里进入了循环,无解。所以这样最多跳 O(n)O(n) 次。使用记忆化搜索则求所有 solve(i)solve(i) 的复杂度为 O(n2)O(n^2)

求答案也是类似的,如果当前操作是结束则结束,否则下一个操作是 push aa 则要跳到 pop aa 后的位置继续找,直到找到结束位置或者无解。