AGC12C Tautonym Puzzle

AGC012C Tautonym Puzzle

考虑在 \(A\) 的前 \(100\) 位递增地填上 \(1 \to 100\)

如果我们限制 \(A\) 的后 \(100\) 位里,\(1 \sim 100\) 每个数最多出现一次。后 \(100\) 位可以不填满。

那么 \(A\) 中好的子序列数量,就是后 \(100\) 位里严格上升子序列的数量。

问题转化成:构造一个序列 \(B\)

  • \(1 \sim 100\) 每个数最多出现一次。
  • 严格上升子序列数等于 \(N\)

构造方式如下:

枚举 \(x\)\(1 \to 100\),将 \(x\) 插入 \(B\) 中。

\(x\) 插入 \(B\) 的后侧,会让 \(B\) 的严格上升子序列数 \(\times 2\)

\(x\) 插入 \(B\) 的前侧,会让 \(B\) 的严格上升子序列数 \(+1\)

\(N\) 二进制拆分即可。上面的 \(x\) 最多运行到 \(2\log N\) 就能构造成功了。

构造出来的 \(B\) 长度 \(2\log N\),对应 \(A\) 的长度 \(100 + 2\log N\)

如果最开始的时候只将这 \(2\log N\) 个数递增地放在 \(A\) 的最开始,可以做到串长 \(4\log N\)

构造时间复杂度 \(\Theta(\log N)\)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值