模拟52—「异或·赌神·路径·树」
异或
考场上直接输出二进制位就找出来规律了。
正解就是 \(2^i\) 每隔 \(2^i\) 变化一次,所以本质就是 \(\sum \lfloor\frac{n}{2^i}\rfloor\)
赌神
考场上直接根据样例解释和最优策略的经验模拟的。
主要就是利用了最优策略不应该被黑手控制,然后看样例解释分配砝码的方式膜了几组发现没事就打了。
正解还是有点意思的。
先考虑 \(n=2\) , 设 \(dp_{i,j}\) 代表当前有 \(1\) 个砝码,第一个球有 \(i\) 个,第二个球有 \(j\) 个时候的方案数。
假设给第一个球压了 \(x\) , 第二个球压了 \(y\) ,则有
可以解出来 \(\large dp_{i,j}=\frac{2*dp_{i,j-1}*dp_{i-1,j}}{dp_{i,j-1}+dp_{i-1,j}}\)
但是这是 \(n^2\) 的。
现在考虑优化,发现其实如果取倒数,很像组合数那个东西,但是多了个 \(2\) 。
所以设 \(f_{i,j}=\frac{dp_{i,j}}{2^{i+j}}\)
带入一下可以得到\(\large f_{i,j}=\frac{f_{i,j-1}*f_{i-1,j}}{f_{i,j-1}+f_{i-1,j}}\)
取个倒数,可以得到 \(\large \frac{1}{f_{i,j}}=\frac{1}{f_{i,j-1}}+\frac{1}{f_{i-1,j}}\)
然后发现可以直接组合数,答案就是 \(\frac{2^{n+m}}{C_{n+m}^{n}}\)
扩展到高维,仍然可以解出来柿子,最后答案就是 \(n^{\sum x_i}/\frac{(\sum x_i)!}{\prod(x_i!)}\)
路径
斯特林数,先咕
树
很妙的一道分块题,平衡了一切换来了 \(n\sqrt{n}\)
首先需要一个根号分治。
对于 \(x\leq\sqrt{n}\) ,发现模数只有根号个,所以可以给每个模数开一个桶存深度(按 \(dfn\) 排序),每个模数的桶中会存储 \(n\) 个数。
然后再把每个模数的同分配到每个余数中,最后一共会存储 \(n\sqrt{n}\) 个数。
每次修改,直接找到对应模数,在对应余数二分定位,树状数组区间修改,一共进行 \(O(q)\) 次,如上做法每次复杂度 \(O(log n)\)。
每次查询,遍历所有模数,找到对应余数,然后树状数组单点查询,一共进行 \(O(q\sqrt{n})\) 次,如上做法每次复杂度 \(O(logn)\)。
对于 \(x>\sqrt{n}\) , 发现每次跳深度只有根号次,所以对每个深度开一个桶,一共存 \(O(n)\) 个数。
每次修改,就边跳深度边修改,一共进行 \(O(q\sqrt{n})\) 次修改,如上做法每次复杂度 \(O(logn)\)。
每次查询,直接查对应深度的桶里面单点查就行了,一共进行 \(O(q)\) 次查询,如上做法每次复杂度 \(O(logn)\)。
不难发现复杂度是不平衡的。
有一个平衡复杂度的经典操作就是序列分块。
分块区间修改区间查询是 \(O(\sqrt n)-O(\sqrt n)\)的。
但是,单点查询,区间修改是 \(O(\sqrt n) -O(1)\) 的。
如果我们进行差分,那么也可以 \(O(\sqrt n) -O(1)\) 实现区间查询单点修改。
所以对以上操作全部换成分块实现,但是发现如果每个桶一个块的话,还需要先二分定位,复杂度仍然没降下去。
所以考虑离线,每个模数,深度分开处理。
这步挺nb的,离线+序列分块平衡复杂度。
然后发现深度的东西我们存不下(开不下 \(n\sqrt n\))的空间。
当然可以调整块长时间换空间,但是还有更nb的技巧。
每根号个分成一组,处理根号次,这样,把我们 \(O(n)\) 处理深度的不平衡也平衡了,而没有增加瓶颈复杂度。
这个题如果把时间空间卡严,还是很难做出来的。
尤其是分块的题,做的时候把所有操作的复杂度都列出来,看哪不平衡就搞哪,尽量避免瓶颈复杂度增加。
总结
这场打的还行,主要是乱搞成功了,都是靠的运气,没啥实力,T4nb题根本不会做。

浙公网安备 33010602011771号