Codeforces Round 815 (Div. 2)

· 题解

该多练了.

B. Interesting Sum

考虑四个选项在序列里面,无论什么样的排列方式都能将它们取出来

因此排个序输出就好..

然而还是卡了很久..

submission

C. Corners

注意到如果存在斜对角的两个0,或者相邻的两个0,就可以从这一块开始每次消一个1

否则只有一个0则是第一次会消两个1,如果没有0则第一次会消除3个1

讨论完输出1的个数减去不同情况的第一次消耗就好

submission

D1. Xor-Subsequence (easy version)

考虑 O(N2)O(N^2) 的暴力转移的DP

发现对于一个位置 (i,ai)(i,a_i),
由于 ai≤200a_i \leq 200,
ii 只会对 [i+1,i+256][i+1,i+256] 的位置产生贡献

超出 i+28i+2^8 的范围的 (j,aj)(j,a_j) 都不满足 ai⨁j<aj⨁ia_i \bigoplus j < a_j \bigoplus i

submission

D2. Xor-Subsequence (hard version)

对于当前的i,考虑能够转移的选项 j (j<i)j\ (j < i),有
fi=max⁡aj⨁i<ai⨁j{fj+1}f_i=\max\limits_{a_j\bigoplus i<a_i\bigoplus j}\{f_j+1\}

从高位往低位考虑,令 ipi^p 表示 ii 的 pp 位

讨论 aip,ip,ajp,jpa_i^p,i^p,a_j^p,j^p 的关系

  1. 若 ajp⨁ip<aip⨁jpa_j^p\bigoplus i^p<a_i^p\bigoplus j^p,

对应到一位上的时候就只有 0<10<1 这一种情况

即

ajp⨁ip=0,aip⨁jp=1ip⨁aip⨁jp⨁ajp=1jp≠aip,ip=ajp\begin{align} &a_j^p\bigoplus i^p=0,a_i^p\bigoplus j^p=1 \notag \\ &i^p\bigoplus a_i^p\bigoplus j^p\bigoplus a_j^p=1 \tag{1.1} \\ &j^p \ne a_i^p,i^p=a_j^p \tag{1.2} \end{align}

  1. 若 ajp⨁ip=aip⨁jpa_j^p\bigoplus i^p=a_i^p\bigoplus j^p, 则

ip⨁aip⨁jp⨁ajp=0\begin{align} i^p\bigoplus a_i^p\bigoplus j^p\bigoplus a_j^p=0 \notag \end{align}

开一个01 Trie维护一个 i⨁aii\bigoplus a_i,从高往低考虑 i⨁aii\bigoplus a_i 的每一位,前面部分相等,在第一个位置 pp 有 (i⨁ai)p≠(j⨁aj)p(i\bigoplus a_i)^p \ne (j\bigoplus a_j)^p,就是一个满足条件的转移选项,我们想知道从这个 jj 转移过来能拿到的值,就要开一个
f[u][0/1]f[u][0/1] 表示trie
当前这个节点,aja_j 在这位上是 0/10/1 的最值

对于每个i,从高往低考虑 i⨁aii\bigoplus a_i 的每一位,
令 v=(a[i]⨁i)cv=(a[i]\bigoplus i)^c

考虑第 cc 位不相等,vv
取反就得到当前节点上满足条件的 jj 节点,然后aja_j也应该满足情况,根据式 (1.2)(1.2)
即 ajc=ica_j^c=i^c,在f里面查这个的最大值

考虑第 cc 位相等,那么就继续找下去

插入的时候用转移来的 dp[i]\mathtt{dp[i]} 去更新
f[trie[p][v]][a[i]c]\mathtt{f[trie[p][v]][a[i]^c]}

写法看的Jiangly的,感觉写的是最清晰的..

submission