AtCoder Regular Contest 138

比赛链接

A - Larger Score

将一个 i 交换出前 K 个并将一个 j 交换进前 K 个需要的次数是 ji

于是只需要对于每个 j>K 找最大的 iK 使得 Ai<Aj

B - 01 Generation

每次将末尾的所有 0 消去,然后只要第一个位置不是 0 就无解。否则消去第一个位置然后将整个串取反。

C - Rotate and Play Game

为什么如此困难???

考虑答案的上界,是前 N2 大的数之和。由于可以自由地选起始位置,大胆猜想一定可以取到这个上界。

将前 N2 大的数标为 1,其他数标为 1,我们需要将整个数组循环移位使得所有前缀和均非负。这是简单的,将最小前缀和的位置移到最前面即可。

D - Differ by K bits

K=1 时是格雷码,构造是简单的。

考虑将格雷码中每个数的每一位都看作一个二进制数,也就是说有一个数组 b0,b1,,bN1,对于格雷码中的一个数 x,设它当中的所有 1 位是 k0,k1,,kl,将它映射到 f(x)=bk0xorbk1xorxorbkl

由于相邻两个数的异或需要 popcount=K,所以所有的 bipopcount 也都需要是 K。这些数还需要互不相同,所以 f(x) 也需要互不相同。

于是只需要找出 N 个线性无关的 popcount=K 的数,将它们作为 b0,,bN1 即可。

E - Decreasing Subsequence

写了个 O(N3) DP,结果和正解一点关系也没有,绷不住了。

对于所有 Ai0i,连边 i(Ai1),这样形成的图是若干条从大指向小的链。一个下降子序列的形态就是 2K 个下标 0LK<LK1<<L1<R1<R2<<RKN,其中 RiLi 有边。

一个下降子序列是 2K 个链上的 2K 条边。将这 2K 条链从下降子序列的位置断开,设 i2K 条链断开后左边部分的大小之和,j 为右边部分的大小之和。计数:

  • (n+1i+j) 枚举链上的点;
  • {iK}{jK} 枚举链划分;
  • x{n+1ijx} 枚举剩下的数的链划分。

时间复杂度 O(N2)

F - KD Tree

首先如果是对操作序列计数,那么可以直接区间 DP:设 fi,j,k,l 表示 x[i,j],y[k,l] 的点的操作序列个数,枚举最后一次操作是什么即可 O(N2) 转移。

沿用这个 DP 状态,但是现在是对可能被生成的排列计数。对于一个状态 fi,j,k,l,将这个范围内的点的 x,y 坐标分别离散化,设有 M 个点,给可能的 2M 种操作定一个顺序:x1<y1<x2<y2<<xK<yK,我们认为一个排列是被字典序最小的操作序列生成的。

gp,hp 分别表示字典序最小的第一次操作是 xp,yp 的可能被生成的排列个数,按照刚才定的顺序计算这些值,每次用不限制字典序最小的方案数减去钦定第一次操作是字典序更小的某个的方案数。

例如要算 gp 时,要减去 gqq<p)的贡献,设 x 坐标不超过 p 的点集是 Sp,此时转移是 gpgpgqfSMSq×fSpSq×fSMSp

对每个 fi,j,k,l 都需要做这样的步骤,总时间复杂度 O(N6)

作者:alan-zhao-2007

出处:https://www.cnblogs.com/alan-zhao-2007/p/17959516

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Alan_Zhao_2007  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题