ARC127 比赛记录

打烂了。
被 A 卡了。
胡了 B 然后直接 skip 了。
被 C 卡了较长时间。
回头过 B。
卡了 D。

A

\(1\cdots n\) 所有前缀数前缀 \(1\) 个数和。
求出至少有一个长度为 \(k\) 的前缀 \(1\) 的个数之和。
枚举 \(k\) 然后枚举这个前缀出现位置即可。
复杂度 \(O(\text{poly}(15))\)

B

直接构造。
发现第一位肯定有 \(n\)\(0\)\(n\)\(1\)\(n\)\(2\)
然后第一位的 \(0\)\(1\) 不管只需要第一位的 \(2\) 后面跟着的最小即可。
直接暴搜搜出前 \(3^{K-1}\) 个最小的,然后直接填即可。

C

直接做做完了。
考虑先整体减一,第一位肯定是 \(1\) 然后诸位确定。
如果当前数是 \(0\),那结束了。
否则如果属于 \([1,2^{m-1})\) 肯定是 \(0\),否则是 \(1\)
如果属于 \([1,2^{m-1})\) 那最高位就是 \(0\) 否则是 \(1\) 所以可以 \(O(1)\) 判断。
然后如果最高为是 \(0\) 就减 \(1\) 否则删去最高位。
根据结论对于一个二进制模拟进位复杂度均摊是 \(O(1)\) 的。
然后判断是否全 \(0\) 直接动态维护当前全局 \(1\) 个数即可。

D

卡 @AhoCorasick 的
我们需要判断 \(a_i\oplus a_j\)\(b_i\oplus b_j\) 的关系。
考虑比较两个二进制数,是找到他们最高不相同位置然后比较,本质上就是 \(\oplus\)
那我们对于每个 \(i\) 我们把 \(a_i\oplus b_i\) 作为代表,那两个数不同只需要比较代表元最高的不同位即可。
我们考虑在最高不同位处统计贡献。
考虑把所有当前这位是 \(0\) 的答案塞到桶里去,然后在对每个 \(1\) 在桶里查询。
有贡献当且仅当:它之前相同(信息量 \(O(n)\)),当前这位不同。
然后贡献计算需要每位拆开,同时还需要记录贡献的是 \(a\) 还是 \(b\)
这里直接分类讨论一下即可。
总复杂度是 \(O(n\log ^2n)\)

E

草,思维题!!!
考虑把最终集合排序,然后找到字典序最大的。
显然就是每次 \(1\) 操作插入 \(1\) 时最大。
如果字典序大于这个最大字典序肯定无解(听君一席话)
如果小于,必定有解。
考虑构造,设那些在答案中出现的为目标状态,然后从小到大排序。
从小到大逐个插入,如果碰到 \(2\) 就拿个不是答案来“垫背”。
可以证明对于每个数“垫背”的数一定存在,所以它肯定可以被构造。
然后搞个 \(O(n^2)\) dp

原文地址:https://www.cnblogs.com/pealfrog/p/15337717.html