2025年03月随便做做
测试题目选集
Atcoder AGC009 - E - Eternal Average
不难发现结果可以表示成一个 \(k\) 进制的数。进一步小巧思一下,满足 \(n'=n-p(k-1),m'=m-q(k-1)\) 的 \((n',m')\), \((n',m')\) 可以表示出的数 \((n,m)\) 一定可以表示出来。那么考虑一个结果 \(A\) ,找到一个 \((n',m')\) 满足它可以得到 \(A\),那么所有 \((n,m)\) 均可以得到 \(A\)。那么考虑这个 \((n',m')\),显然它一定偏序大于等于 \((\mathrm {bitcount}(A), \mathrm {bitcount}(1-A))\)。然后发现这总是可以构造出来的,然后就结束了。
dp 时间复杂度 \(O(n^2)\)。
Submission #63958086 - Japan Russia Exchange Programming Contest 2017
QOJ#8426. Algebra on Segment
考虑原根为 \(g\),那么若答案为 \(a\),则群为 \(g^{\frac{p-1}{a}}\) 的生成子群。考虑若加入一个阶为 \(b\) 的群,那么群实际上就是 \(g^{\gcd(\frac{p-1}a, \frac{p-1}b)}=g^{\frac{p-1}{\mathrm{lcm}(a,b)}}\)。所以如果只是区间查询一下,那么是可以转化为区间 \(\mathrm{lcm}\) 的。考虑带区间乘法之后,小巧思后将每个位置转化成前缀积,就转化成单点修改了。考虑求一个数的生成子群的阶是可以简单做到 \(O(\log_2^2 n)\) 的,线段树上的区间 \(\mathrm{lcm}\) 也是一样。
时间复杂度 \(O(n\log_2^2n)\)。
QOJ#2118. Poborcy podatkowi [A]
LuoguP8478 - 清明
LOJ#3971. 水羊羹2
Miscellaneous
QOJ#964. Excluded Min
Codeforces Round 1012 (THUPC2025 Final) Div. 1
“假如我打了THUPC2025”。某人不知道是THUPC2025相关的比赛,以为是正常 22:35 开始的 div1 导致比赛的两个半小时一直在 lol。
“这场真不难吧,感觉要是打了 perf 总得 2800+ 吧,不说写完 D,至少 C2 以前的都随便乱过的吧”。
Codeforces 2089B2. Canteen (Hard Version)
二分 \(l\) 表示轮数,那么可以从一个位置出发向后走,如果超过 \(l\) 就用 \(k\) 去填,正确性显然。
Submission #312143994 - Codeforces
Codeforces 2089C2. Key of Like (Hard Version)
“宝贝如果你不想放 \(O(n^2lk)\) 过可以把 \(n\) 开大点。”
首先考虑 \(k=0\) 的情况,在一开始选择了第 \(x\) 把钥匙和第 \(y\) 把锁之后,之后直到一次匹配成功为止,选择的 \(x',y'\) 满足要么 \(x'=x\),要么 \(y'=y\)。若第二次选择了 \(x',y\),则直到第 \(y\) 把锁匹配成功为止,一定只会选择 \(?,y\)。选择 \(x,y'\) 同理。而这两个的概率是相等的。然后会发现如果剩余 \(u\) 把钥匙和锁,则第 \(1\) 次操作到第 \(u\) 次操作成功的概率均为 \(\frac 1 u\),然后就 \(dp(i,j)\) 表示当前已经匹配 \(i-1\) 把钥匙和锁,当前轮到第 \(j\) 个人操作,简单 dp 即可。
如果 \(k>0\),那么如果剩下 \(l+k\) 把钥匙,\(l\) 把锁。则发现选择了 \(x,y\) 之后如果没成功,下次选择 \(x',y\) 和 \(x,y'\) 成功的概率仍然相同,为 \(\frac 1 {l+k}\)。当然因为可选的 \(x'\) 和 \(y'\) 数量不同,所以选到的概率也不同,分别是 \(\frac {l+k-1} {2l+k-2}\) 和 \(\frac{l-1}{2l+k-2}\)。
如果选择了 \(x',y\),那么之后的情况就和 \(k=0\) 类似了,随后在 \(0\) 到 \(l+k-1\) 次操作内成功的概率均为 \(\frac 1 {l + k}\)。
如果选择了 \(x,y'\),则考虑有 \(\frac{l}{l+k}\) 的概率 \(x\) 是真钥匙,匹配到对应的钥匙的概率是 \(\frac 1 l\),因此用 \(0\) 到 \(l+k-1\) 次操作成功的概率均为 \(\frac 1 {l+k}\)。还有另一种情况是 \(x\) 是假钥匙,那么会操作 \(l+k-1\) 次操作且发现这是一把假钥匙,之后不会再选它。
因此可以在 dp 上多加一维,\(dp(i,j,k)\) 中的 \(k\) 表示剩下的假钥匙数量。然后前缀和优化一下就行了。
Submission #312171395 - Codeforces
Codeforces 2089D. Conditional Operators
WA 了巨多次,鉴定为 Connor Case 分析不合格,感觉如果参加了不一定写得出来。
相当于每次在串中取连续连续取三个值 x,y,z,删去之后在将被分成两段的串按照 左-x?y:z-右 的顺序拼接。
来点小巧思,容易发现 000 可以 0?0:0=0,001 可以 0?0:1=1。因此在原串中:如果一段 0 后面有 1,则可以将它的长度向 \(2\) 取模;否则这段 0 位于末尾,若长度为偶数则变成 00,否则变成 0。
将原串的所有连续 0 段进行上述调整,最终变成一个新的串,称为新串,容易发现新串长度也为奇数。
通过一定的直觉,感觉到新串上的 11 很关键,发现之后和之前不管怎么操作这些 11 的数量不会变多(他们可以重合,即 111 算作两个 11)。
发现如果新串中存在至少两个 11,那么一定有解。考虑构造:
- 找到第一个
11出现的位置,然后每次往前做x?1:1=1。 - 若新串以
1开头,则形如101011...->1011...->11...,此时开头11后面无论怎么计算,最后都可以变成形如1?1:(...)。 - 若新串以
0开头,则形如0101011...->01011...->011...->1...,然后从第二个11出现的位置也往前做,同样得到开头有一个11,之后和以1开头同理。
然后考虑存在一个 11 时的情况。其实从上文发现,新串以 1 开头时只需要存在一个 11 就可以构造,所以考虑新串以 0 开头的情况,然后会发现。
- 如果此时结尾为
1,则一定有解,因为可以通过x?1:1=1和1?1:x将新串变为011,显然有解。 - 如果此时结尾为
0,因为仅存在一个11,所以一定形如0101...0110101...010100,此时无解。考虑证明,聚焦于末尾的00上,如果某一时刻末尾不再是两个0,那么一定是(1?1:0)0=10或者1(1?0:0)=10,发现这无疑消耗掉了一个11,根据一开始11不会变多的性质,说明此时序列形如01010,可以归纳进下文对于没有11的情况(结果是无解)。
然后考虑不存在 11 的情况:
- 如果结尾有
00,则无解。证明考虑前文提到过,如果要去掉一个末尾的00一定需要前面有11,否则最终会得到x?0:0=0。 - 如果新串形如
10101..01,那么1的个数为奇数时一定有解。考虑(101)01...->001...->1...,进行形如这样的操作时可以消除两个1,如果个数为奇数则有解。否则如果原串为101则无解,否则有解。因为我们可以通过1(0?1:0)1=101将1的个数减少 \(1\) 变为奇数。如果新串为101且原串不为101,则一定会出现010或100,同理可以减少1的个数变为奇数。 - 如果新串形如
01010..10,那么无解。因为此时想要把开头变成1需要11,所以开头最后一定是0。
然后就结束了。应该是存在更简单的做法的。
Submission #312273502 - Codeforces
Codeforces 2089E. Black Cat Collapse
不赖。
考虑一个序列如果不考虑祖先-后代关系(即因为先删去祖先,后删去后代时没有点可删),那么只需要满足 \(p_i\le n-i+1\),进一步考虑,发现只要后缀 \(\max\) 处的 \(p_i\) 满足条件就可以了。这样做有什么好处吗?因为考虑后缀 \(\max\) 依次为 \(q_1>q_2>\cdots>q_m=1\),那么编号在 \((q_{i+1},q_i)\) 之间的点就只能填在 \(q_i\) 所在位置之前,并且相对顺序满足祖先后代关系。同时发现 \((q_{i+1},q_i)\) 和 \((q_{j+1},q_j)\) 如果各自已知相对顺序,那么合并时的顺序是不会影响祖先-后代条件。围绕这个性质就很有说法了。
记 \(g(x,y,z)\) 表示从 \(x\) 到 \(y\) 的链上的编号在 \(x,y\) 之间的子树中选出 \(z\) 个合法的点以及相对顺序的合法方案,满足祖先-后代关系。
那么就可以 dp,记 \(dp(i,x,j)\) 表示当前在处理第 \(i\) 次操作,下一个后缀 \(\max\) 的值是什么,前面还有 \(j\) 个空位可以填。转移考虑是否要求这次操作填入的数是下一个后缀 \(\max\) 即 \(x\)。
如果不是,那么暂时留出这个空位;如果是,那么这个位置填入 \(x\) 满足 \(x\le n-i+1\),枚举下一个后缀 \(\max\) 为 \(y\),那么在编号在 \(x,y\) 之间的点只能填在 \(i\) 前面留出的 \(j\) 个空位,所以再枚举选 \(k\) 个数填进去就行了,系数乘以 \(g(x,y,k){j\choose k}\) 就行,注意到因为先操作了 \(g(x,y,k)\) 的点,再操作了 \(x\) 和 \(y\),所以 \(x-y\) 链上点是不能操作的,所以 \(g\) 的定义是对的。

浙公网安备 33010602011771号