CodeCraft-20 (Div. 2) 总结

闲话

这场做的时候完全心不在焉,导致做了三题就跑路看电影去了(大雾)……晚上做东西意志力真的很差

第二天补了好久才补完,F 题虽然难度不大但是卡了很久,看来这种类似 [HAOI2012] 高速公路 的题目还是做得不熟练

D 题反应出思维能力还是很欠缺

题解

(单击题号查看完整题解)

题意描述 题解
A 每个学生的分数最少为 \(0\),所以我们只要把除了第 \(1\) 名学生之外的所有学生的分数全部给第 \(1\) 个学生就能使他的分数最大。
B 实质上就是整个字符串左移若干位,多出来的部分挪到右边,并根据奇偶翻转
C 给定两个序列 \(a,b\),保证每个序列中所有数字的 GCD 为 \(1\),设 \(a*b=c\),给定质数 \(p\),求 \(t\) 使得 \(c_t\) 不能被 \(p\) 整除 要使 \(c_i \bmod p \neq 0\),则 \(a_0b_i, a_1b_{i-1}, \dots, a_ib_0\) 中至少有一项满足 \(a_xb_y \neq 0 \bmod p\),这要求 \(a_x,b_y \neq 0 \bmod p\),于是我们只需要按下标从小到大找到第一个 \(a_i \neq 0, b_j \neq 0 \bmod p\),那么 \(i+j\) 就是答案
考虑充分性,设第一个不能被 \(p\) 整除的是 \(a_i,b_j\),那么对于 \(c_{i+j}\),它的其它项中一定都含有 \(p\) 因子
D 对一个 \(n\times n\) 的棋盘,每个格子上有一个字母,表示遇到这个格子就向着某个方向走或者停止。现在给定从每个位置开始会走到的位置,或者死循环,试构造一个合法的棋盘,或者输出 INVALID。 除去死循环的部分,终点相同的点会形成独立的联通块,我们从终点开始反向 DFS 即可
如果死循环是单独的一个点,则 INVALID
否则,我们强行构造出一个二元环,然后当做第一种情况做即可
E 需要在 \(n\) 个人中选出 \(p\) 个人站着队伍中的各个位置上,再从剩下的 \(n-p\) 个人中选出 \(k\) 个人作为观众。第 \(i\) 个人作为观众可以有 \(a_i\) 的得分,作为队伍中第 \(j\) 个位置上的人可以有 \(s_{i,j}\) 的得分,求得分的最大值。\(n\leq 10^5, p\leq 7\) 将人按照 \(a\) 从大到小排序,这样如果敲定了哪些人是队伍,那么剩下的靠前的 \(k\) 个一定是观众
考虑状压 DP,设 \(f[i][j]\) 表示考虑了前 \(i\) 个人,队伍中各个位置的状态为 \(j\) 的得分最大值,决策下一个人放在队伍的哪一个位置,或者不入队,如果不入队则判定如果 \(i-popcount(j) \leq k\) 则去当观众
F 定义一个 \(n\) 元序列 \(p_i\),如果 \(n=1\),则序列权值为 \(0\),否则序列权值就是原序列排序后相邻两项乘积的和。现在等概率地选出一个子序列,问它的权值的期望是多少。支持动态单点修改。 对于静态情况,答案为
\[\sum_{i=1}^n \sum_{j=i+1}^n \frac{p_i p_j}{2^{j-i+1}}\]
考虑用线段树维护,对于区间 \([l,r]\),我们设 \(val\) 为当前区间权值,\(lv=\sum_{i=l}^r p_i2^{i-l}\),\(rv=\sum_{i=l}^r p_i/2^{i-l+1}\),\(sz\) 是当前区间内数的个数,则
\[val=val_L+val_R+\frac{1}{2} vl_Lvr_R/2^{sz_L} \\ sz=sz_L+sz_R \\ vl= vl_L+vl_R2^{sz_L} \\ vr=vr_L+vr_R/2^{sz_L}\]
对于单点 \(a\),它的 \(val=0, sz=1, vl=a, vr=a/2\)
考虑到序列中有重复元素,我们先将所有元素(包括修改的)一起读进来排序,然后将原始的先激活,修改后的先不激活(\(val=0,sz=0,vl=0,vr=0\)),一起挂在线段树上

2020年3月11日

上一篇:CodeCraft-21 and Codeforces Round #711 (Div. 2)


下一篇:CodeCraft-20 (Div. 2)【ABCDE】(题解)