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 mod p eq 0),则 (a_0b_i, a_1b_{i-1}, dots, a_ib_0) 中至少有一项满足 (a_xb_y eq 0 mod p),这要求 (a_x,b_y eq 0 mod p),于是我们只需要按下标从小到大找到第一个 (a_i eq 0, b_j eq 0 mod p),那么 (i+j) 就是答案
考虑充分性,设第一个不能被 (p) 整除的是 (a_i,b_j),那么对于 (c_{i+j}),它的其它项中一定都含有 (p) 因子
D 对一个 (n imes n) 的棋盘,每个格子上有一个字母,表示遇到这个格子就向着某个方向走或者停止。现在给定从每个位置开始会走到的位置,或者死循环,试构造一个合法的棋盘,或者输出 INVALID。 除去死循环的部分,终点相同的点会形成独立的联通块,我们从终点开始反向 DFS 即可
如果死循环是单独的一个点,则 INVALID
否则,我们强行构造出一个二元环,然后当做第一种情况做即可
E 需要在 (n) 个人中选出 (p) 个人站着队伍中的各个位置上,再从剩下的 (n-p) 个人中选出 (k) 个人作为观众。第 (i) 个人作为观众可以有 (a_i) 的得分,作为队伍中第 (j) 个位置上的人可以有 (s_{i,j}) 的得分,求得分的最大值。(nleq 10^5, pleq 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日

原文地址:https://www.cnblogs.com/mollnn/p/12464574.html