The 2nd Universal Cup Semifinals

D. Solar Panel Grid Optimization

考虑将最后一列不停旋转,然后向左边推数进去,对每一行推了 \(n-1\) 次后,左边的所有 \(n-1\) 列的元素就匹配了。

具体操作是:从第 \(1\)\(n-1\) 列一列列考虑,先把符合 \(b\) 的推进去,然后把最后一列转 \(n\) 次,再把剩下的推进去。

发现这样做直接花掉了 \(2n^2\) 次操作。

这样做完最后一列的元素 \(a_{i,n}\) 会 xor 上 \(\oplus (a_{i,j}\oplus b_{i,j})\),可能还有额外的全部翻转一次。但这样并不一定等于 \(b_{i,n}\)

考虑写点乱搞,枚举每一列转若干下,这样这一列对于最终状态的贡献会改变。写个状压 DP 最小化转的次数,发现就过了。

大胆猜测随机打乱、写点线性基乱搞也能过。

E. Fast Median Transform

每次操作是将 \(x\) 向一个区间 \([\min(a_{i},b_{i}),\max(a_{i},b_{i})]\) 内缩合(\(x\to \text{clamp}(x,l,r)\))。

从后向前考虑,相当于有 \(nm\) 个区间 \([\min(a_{i},b_{i}),\max(a_{i},b_{i})]\),每次会区间取交一下,如果区间变成空的答案就确定了;如果一直不是空区间,则答案就是 \(\text{clamp}(x,l,r)\)

那我们就要求出 区间变成空的 那个时刻的信息,或者这个区间最后是什么。

考虑到只修改 \(a\) 数组,我们先把 \(a\) 数组和 \(b\) 匹配 \(n\) 轮,让每个 \(a\) 都被匹配到。如果这 \(n\) 轮下去区间不为空,则 \(a\) 的每个位置作为 \(l\) 还是作为 \(r\) 是可以确定的(如果之后过程中某个数一次作为 \(l\),一次作为 \(r\),区间就为空了)。

我们又能发现一些其他性质,下面描述一下。

1:只要匹配了最后的 \(\max(2n,2m)\) 次(每个数被匹配了至少两次),如果此时区间仍然不为空,那之后也不会为空了。

\(n=m\) 则显然。对于 \(n\ne m\),考虑每个数在第一次匹配的时候就能确定它是 \(l\) 还是 \(r\),下一轮的时候,每个置换环会移动一位。经过一些讨论,发现了结论

2:考虑一个 \(a_i\) 前一次匹配了 \(b_x\),后一次匹配了 \(b_y\),那么在后一次的时候 \([\min(b_x,b_y),\max(b_x,b_y)]\) 这个区间的数一定已经爆了(指在维护的那个区间外)。

正确性显然,这也同时能说明上一个结论。

在第一轮过后,显然每次区间取交只会排除某个区间 \([b_x,b_y]\) 的数。由于这个结论只和 \(b\) 有关,可以忽略 \(a\) 的影响,提前预处理出每个数最早在什么时间爆了。这可以用并查集维护区间覆盖得到。

[这里还缺一点,明天再写]

G. CNOI Knowledge

考虑增量法,每次我们想求出 \(a_r\) 和前面哪个元素相等,或者全部不相等。

二分一个 \(l\),如果 \([l,r-1]\) 内的字符都和 \(a_r\) 不相等,那字符串个数就是 \(\text{count}(l,r) + (r-l+1)\),否则会比这个数少。那么二分 \(l\) 即可找到最右的和 \(a_r\) 相等的字符。

需要写一个 \(O(n^2)\) 求所有子串的本质不同子串个数,我写了 sam。

posted @ 2024-07-03 00:26  Rainbow_qwq  阅读(60)  评论(0编辑  收藏  举报