Live2D

Solution Set -「LOCAL」冲刺省选 Round VII

\(\mathscr{Summary}\)

  三道结论题,毁灭吧。

  A 题一开始思路偏了,发现答案最高 bit 能固定之后接下来的结论就顺理成章了。

  B 题哈哈哈哈又是经典:我结论猜对了,然后心里给念叨,念着念着嘴瓢了,写暴力出来错了,然后就没分了。

  C 题:你怎么不放 A 题?

  策略不对头啊哥,你怎么没先发现 C 题最水呢?这样真的很危险。

\(\mathscr{Solution}\)

\(\mathscr{A}-\) 合成小丹

  给定可重集 \(A=\{a_n\} \newcommand{\or}[0]{\operatorname{or}} \newcommand{\rsh}[0]{\operatorname{rsh}} \newcommand{high}[0]{\operatorname{high}}\),进行 \(n-1\) 次以下操作之一:

  1. \(\{x,y\}\subseteq A\),令 \(A\leftarrow (A\setminus\{x,y\})\cup\{(x\or y)\rsh 1\}\)

  2. \(x\in A\),令 \(A\leftarrow A\setminus\{x\}\)

其中 \(\or\) 是按位与,\(\rsh\) 是右移。最终 \(A=\{r\}\),求出可能的最小 \(r\)

  \(n\le10^5\)\(w=60\)\(a_i\in[0,2^w)\)


  把原问题说好听点:在 $A $ 里选一些数做 1. 操作,最小化结果 \(r\)。根据经验,位运算下的最小化问题很有局部性,我们可以尝试先最小化 \(r\) 的最高 bit。

  记 \(\high(x)=\lceil\log_2x\rceil~(x>0)\)。在这一目标下,显然,当且仅当 \(\high(x)=\high(y)\),对 \((x,y)\) 的操作才是有意义的。我们按 \(\high\) 降序模拟,看看最低能在哪个 \(\high\) 处留下一个数。记此时的 \(\high\) 值为 \(h\)。可见,\(\high(r)=h\)

  由于 \((x\or y)\rsh k=(x\rsh k)\or(y\rsh k)\),那么对于每个数 \(x\),若它参与了 \(r\) 的合成,则它至少被 \(\rsh\)\(\high(x)-h\) 次。当然,这一次数的实际值越小,我们就更有可能合成出 \(h\) 最小的 \(r\)。这印证了我们在上文直接按照 \(\high(x)-h\) 这一 \(\rsh\) 次数对 \(x\) 进行的归类的确能求到最小的 \(\high(r)\)

  想一想,被额外 \(\rsh\) 的数就没用了吗?并不。我们可以用它们作为 1. 操作的“炮灰”,让另一个数被 \(\rsh\),甚至,“炮灰”和“炮灰”还能在 1. 操作中合成更“厉害”的“炮灰”。

  回到解题,既然 \(\high(r)\) 定了,我们可以从高到低枚举 \(r\) 的 bit,检查这一 bit 能否取 \(0\)(局部性)。根据上文结论,对于每个数 \(a\),我们可以求到它至少被 \(\rsh\) 多少次后,被 \(\or\)\(r\),才不会破坏已经确定的高位 bit 和当前 bit 假定的 \(0\)。被 \(\rsh\) 的次数越小越好嘛,我们直接把这一次数当做 \(a\)\(\high\),在此模拟上文求 \(h\) 的操作,看看能不能把同样的 \(h\) 取出来。若能,则这一 bit 可以为 \(0\)

  暴力实现是 \(\mathcal O(Tnw^2)\) 的,不过瓶颈是位运算和整数自加,而且难卡,所以我过了。对 \(r\) 中每个 \(0\) 分别构造对每个数 \(a\) 的右移次数限制,精细实现可以做到 \(\mathcal O(Tnw)\)。讲个笑话,有人 \(\mathcal O(Tnw^3)\) 过了。

\(\mathscr{B}-\) 路过中丹

  对于字符串 \(T\),成一个合法遍历 \(P=p_1\cdots p_k\),满足 \(p_i\in[1,|T|],p_1\neq p_k,|p_i-p_{i-1}|=1\),且 \(T'=T_{p_1}T_{p_2}\cdots T_{p_k}\) 是回文。若 \(T\) 的每个下标都能存在于一个合法遍历中,则 \(T\) 合法。给定字符串 \(S\) 以及 \(q\) 次询问,每次给出 \([l,r]\),询问 \(S[l:r]\) 是否合法。

  \(|S|,q\le10^6\)


  手玩一下样例:若存在 \(T_i=T_{i+2}\),则 \(T\) 合法。

  证明,构造遍历:\(T_{i+2}\cdots T_2T_1T_2\cdots T_iT_{i+1}T_i\),是回文。另一侧同理。

  另一个显然的结论:若 \(T\) 中的每个字符都存在于某个长度大于 \(1\) 的回文串中,则 \(T\) 合法。(草了,我上面那个对了这个胡错了。)

  经讨论可以说明:不存在其他有效的遍历方案使得不满足这两个条件的 \(T\) 合法。

  怎么维护?第一个结论直接记前缀和。第二个,Manacher + 单调栈求出 \(S\) 中从 \(i\) 开始的最短回文串结束位置 \(r_i\),以及到 \(i\) 结束的最短回文串开始位置 \(l_i\)\(S[l:r]\) 合法,当且仅当满足第一个条件,或者不存在 \(i\in[l,r]\),使得 \(l_i<l\le r<r_i\)。按照询问右端点离线,BIT 维护一下每个左端点的合法情况即可。复杂度 \(\mathcal O((n+q)\log n)\)

\(\mathscr{C}-\) 膜拜大丹

  有一个有向图 \(G\),结点编号 \(1,2,\dots,n+m\)。对于结点 \(i\in[1,n]\)\(\lang i,n+1..n+{a_i}\rang\in E\);对于结点 \(i\in(n,n+m]\)\(\lang i,1..b_i\rang\in E\);不存在其他边。现限定 \(1..n\) 最多存在于 \(c_{1..n}\) 个简单环中,\(n+1..n+m\) 最多存在于 \(d_{1..m}\) 个简单环中,求能取出多少个简单环。

  \(n,m\le5\times10^5\)


  显然:

  • 最优情况下,环是二元环;
  • 按编号降序选二元环,答案最优。

降序枚举 \(n..1\),维护在 \(n+1..n+m\) 里能作为二元环另一个端点的结点集合,模拟即可。复杂度 \(\mathcal O((n+m)\log m)\)

posted @ 2022-03-09 20:57  Rainybunny  阅读(92)  评论(0编辑  收藏  举报