Codeforces Round 1008 部分题解
A/C - Breach of Faith
题意
给定数列 \(a_{1,2\cdots 2n+1}\) 的其中 \(2n\) 个数字,找到一个 \(a\) 的原始序列满足:\(a_i \geq 1\) ,所有元素互不相同且 \(a_1=a_2-a_3+a_4-a_5+\cdots +a_{2n}-a_{2n+1}\)。
题解
设给定数组为 \(b\),将最大值设为 \(a_1\),其余值从大到小排序后设为 \(a_3,a_4 \cdots a_{2n+1}\),再计算 \(a_2\) 即可,此时 \(-a_3+a_4- \cdots-a_{2n}+a_{2n+1}\) 一定是负数,其绝对值加 \(a_1\) 一定大于 \(a_1\),大于全局最大值,数字一定不同。
B/E - Finding OR Sum
题意
交互库有一对 \(0 \leq x,y < 2^{30}\),可以询问 \(n\) 得到 \((x | n)+(y | n)\),最多询问两次,最后交互库给出 \(m\) ,输出 \((m | x)+(m | y)\)。
题解
我们希望得出对于每一位 \(i\),\(x,y\) 第 \(i\) 位总共有多少个 \(1\)。
若 \(x,y\) 都只有一位二进制,我们可以询问 \(0\),这样看第一位和第二位就能确定这一位的 \(1\) 数量。这个方法要求第二位一定是 \(0\)。若 \(x,y\) 有两位,我们可以询问 \(2\),即只把第二位设 \(1\),再把最终结果减去两个 \(2\),此时原本第二位有贡献 \(2 \times 2^1\),把这个贡献减掉,恰好第一位是 \(0\),同时把第二位空出来了,此时可以问出第一位。
扩展到一般,我们问 \(10101010\cdots\),再把每一位反转后再问一次,每一次询问都能把 \(0\) 这一位的值给问出来,两次操作确定每一位 \(1\) 的个数。
C/F - Binary Subsequence Value Sum
题意
给 \(01\) 串,一个 \(01\) 串的价值定义为 \(\max_{1\leq k \leq n}(F(1,k) \times F(k+1,n))\),其中 \(F(l,r)=(r-l+1)-2\times \sum_{i=1}^n[s_i=0]\)。
求 \(s\) 的所有子序列的价值的和,并且有若干次修改,每次翻转一个位置输出答案。
题解
把 \(0\) 当 \(-1\),\(1\) 当 \(1\),\(F(l,r)\) 就是区间和,设一个串的和是 \(m\),根据基本不等式,取 \(\lfloor\frac{m}{2}\rfloor\) 和 \(\lceil\frac{m}{2}\rceil\) 是最优的,又由于区间和 \((1,x)\) 在整数上是连续的,这个值一定能取到。因此一个字符串 \(s\) 的价值就是 \(\lfloor\frac{m}{2}\rfloor \times \lceil\frac{m}{2}\rceil\)。
若 \(m=2k\) 则价值为 \(k^2\),此时当 \(n=m+1\) 时价值为 \(k^2+k\),增量为 \(k\)。
若 \(m=2k+1\) 则价值为 \(k(k+1)\) ,当 \(n=m+1\) 时价值为 \((k+1)^2\),增量为 \(k+1\) 。可以发现奇数和偶数的递推增量仅相差一个 \(1\)。
先不考虑修改,递推解决这个问题,我们设前 \(i\) 个元素的总代价和为 \(f_i\),若第 \(i+1\) 是 \(1\),设前 \(i\) 个的所有子串的长度和是 \(s\),长度为奇数的串数量为 \(cnt\) ,那么 \(f_{i+1}=f_i+\frac{cnt+s}{2}\) 。解释一下:我们发现上文中加 \(1\) 后增量都有个 \(k\),奇数带一个 \(1\),也就是 \(s+cnt\),最后 \(k\) 是长度的一半,所以除以二。
对于 \(s_{i+1}=0\) 的情况同理更新。
把空集长度当成偶数,可以归纳证明长度奇数和长度偶数的串数量是相等的,因此加一个数后 \(cnt=cnt\times 2\)。
我们把 \(s\) 任意重排,每个子序列都是还能找到的,因此答案不变,于是我们可以定义这个线性变换的逆变换作为删除操作,修改操作即为做一个逆变换再做一个正变换,换言之,这个线性变换是可交换的。直观的讲,你可以把修改位挪到最后一位去,删除最后一位再加上翻转的位,再挪回原来的位置。
或者写 DDP 也可以。
F - Another Folding Strip
题意
一个正整数数组 \(a_n\) 的价值为以下操作使得 \(a\) 变为全 \(0\) 的最小操作次数:
想象一个纸带,先进行任意折叠操作,接着选择一个点把折叠到这些点上的位置全部减一。
给定数组 \(a_n\),求所有连续子串的价值和。
题解
考虑两个位置 \(i<j\),若 \(i,j\) 奇偶性不同则 \(i,j\) 可以在一次操作内同时操作,否则就不行,可以模拟一下。扩展开,一次操作可以选择 \(i_1,i_2,\cdots i_k\) 满足 \(i_j\) 和 \(i_{j+1}\) 奇偶性不同,这些位置全部 \(-1\) ,这是交替选择的过程。
于是我们把奇数位取负数,再做观察。
我们发现一次操作后,任意区间的和要不不变要不绝对值减小 \(1\) ,可以得到操作次数的下界是最大区间和绝对值,我们断言最少操作次数就是这个下界。
我们找到所有的区间满足区间和绝对值是最大的,且端点不是 \(0\)。可以发现区间左右端点一定奇偶性相同(否则扩展一位值更大),且区间不相交(若相交则合并起来值更大),且相邻区间的左右端点奇偶性不同(相同的话也能合并区间,中间区间不是最大值,合并后的区间值更大)。
想让一个区间和绝对值减少,这个区间操作的奇偶数量不能相同,我们贪心的取每个区间的左端点为第一个操作点,若操作一个偶数就接一个奇数,由于左右端点奇偶性相同,最后一定可以得到一个奇偶性不同的操作序列,且最后一个操作数和左端点奇偶性相同,根据前面的理论,每个区间的操作序列都能拼接上,最后所有区间的值都减少 \(1\)。
因此一个序列的答案就是最大区间和绝对值,即前缀和的极差,设前缀和是 \(c_i\),即求 $ \sum_{1 \leq l \leq r \leq n} (\max_{l \leq i \leq r} c_i - \min_{l \leq i \leq r} c_i)$,这里忽略了一些情况,即最大区间可能左端点在最左端的情况,此时整个区间的前缀和同号,需要特判一下。

浙公网安备 33010602011771号