Loading

【题解】UOJ Round #18

// created on 22.09.26

A. 绝对不鸽

考虑我们的思考过程 .. :先找操作策略,然后通过合并策略 / 寻找性质来得到更优的复杂度。

首先考虑 \(a=0\):我们可以通过不断地让 \(B\) 个牺牲,每次全部提成 \(\lfloor\frac{A-1}{B}\rfloor\),使得每次操作肯定会剩下若干次机会,然后用这些机会将剩下 \(n-B\) 个填满 —— 此时 \(n-B\) 个数全部都是 \(\lfloor\frac{A-1}{B}\rfloor\)

对于原问题,我们考虑排序。然后考虑排名为 \(k\) 的数被作为最终答案 —— 在此之前,我们认为每次操作一定删除最大的 \(B\) 个,而每次加上来的数一定不会替代原来最大 \(B\) 个的位置(否则将操作调整)。那么排名为 \(k\) 的数操作次数是一定的:只会操作 \([k,n]\),因为 \([1,k-1]\) 更小,操作就是浪费次数。

而剩下的情况,肯定是选择了被删掉的数作为最终答案:初始值是 \(0\),在全部清空后,答案就和全 \(0\) 开始的答案无异了!

于是实现的时候,只需要先计算 \(a=0\) 。然后考虑 \(k\),直接计算是 \(O(n^3)\) 。不过考虑二分第一次 "填平" 的操作,在这个操作之前的主持人的操作都不会对码农的造成影响。然后再二分具体的 "填平" 位置。

此时剩下的所有问题(无论 \(a=0\) 部分还是一般情况)都可以表示成 \(\mathbf{calc}(n,i)\) 表示长度为 \(n\),前 \(i\) 个位置是 \(0\),后 \(n-i\) 个是 \(1\),每次操作固定删除最后 \(B\) 个,求最优值。直接递归单次 \(O(\frac{n}{B})\)

于是我们得到了一个朴素的 \(O(\frac{n^2}{B})\) 做法,细节很多。

提交记录:Submission #585138 - Universal Online Judge (uoj.ac)

接下来我们怎么优化?寻找性质!我们猜结论:\(\mathbf{calc}(n,i)\) 是分段函数,且段数是常数段!通过归纳或者打表可以发现的确如此。于是递推处理即可。

时间复杂度 \(O(n\log n)\)

提交记录:Submission #585187 - Universal Online Judge (uoj.ac)

被 Extra Test #7 Hack 了,原因不明。细节太多了,我不想调了。

B. 没这种事

考虑我们的思考过程 .. :先找判定策略,找同构规律,构造翻转。

  1. Observation #1:位置 \((i,j),(n-i+1,j),(i,m-j+1),(n-i+1,m-j+1)\) 构成一个封闭的集合。

为了方便,我们先讨论 \(n,m\) 都是偶数的情况:此时所有封闭的集合都是四元组。

  1. Observation #2.1:我们可以通过对四元组的翻转方案进行构造,使得在 \(i,n-i+1,j,m-j+1\) 四条轴均翻转偶数次的情况下,拓展出包含自身共 \(12\) 种状态。

这意味着在不影响其他四元组的情况下,一个四元组的 \(12\) 种状态可以互相转化。

  1. Observation #2.2:\(\begin{bmatrix}0&1\\2&3\end{bmatrix}\)\(\begin{bmatrix}1&0\\2&3\end{bmatrix}\) 无法实现在所有轴仅翻转偶数次情况下的互相转化。
  2. Observation #2.3:对于存在元素相同的四元组,一定可以通过构造使得在所有轴所有轴仅翻转偶数次情况下,所有状态互相转化。

当四个数都不同时,一个四元组有 \(24\) 种不同的状态(我们姑且记 0 / 1 表示两个无法相互转化的集合)。这意味着,如果我们翻转一条轴,相当于翻转了这条轴上的四元组的 0 / 1 状态(对于存在数相同的四元组,则不存在状态翻转,属于定点)。

我们仅考虑左上侧矩阵,对于每次翻转,也仅需要考虑该翻转是否存在。

  1. Obversation #3:对于 \(2n\times 2m\) 的矩阵的所有翻转操作,对应到左上侧 \(n\times m\) 的矩阵中时。一个状态可以相互转化得到的状态数是 \(2^{k}\) 。其中 \(k\) 是:考虑对应一个左侧 \(n\) 个点,右侧 \(m\) 个点的二分图,那么 \(k\)\(n+m-c\),其中 \(c\) 是连通块数量。

考虑连通块的系数。考虑先求任意方案数,然后 \(\ln\) 得到连通块数,带上 \(\frac{1}{2}\) 后再 \(\exp\) 回去就行了 —— 我们发现着其实就是多项式开方,我们要进行的也正是二维多项式开方。

可能和 Solution 殊途同归了,也可能本来就是一样的,没仔细看。

提交记录:Submission #585245 - Universal Online Judge (uoj.ac)

实现细节是,我们并不需要二维多项式开方。只需要对一维暴力计算贡献,另外一维推下式子就行了。复杂度是 \(O(n\sqrt{n})\),不过瓶颈处常数极小(剩下的部分是 \(\sqrt{n}\) 次求逆,和一次开方)。

C. 在路上了

数据范围是 \(\frac{1}{2}n\leq k\leq \frac{2}{3}n\)\(\frac{3}{2}k\leq n\leq 2k\)

做你妈做。

posted @ 2022-09-27 14:53  Qiuly  阅读(63)  评论(0编辑  收藏  举报