2017 年六省联考简要题解
# Day 1
# T1 期末考试
有 n 个同学,m 个科目。每个科目计划在 bi 天公布成绩,第 i 位同学希望在第 ti 天及以前知道所有科目的成绩,假如最晚的一个科目公布时间为 t ,则其不满意度为 max(0,t−ti)×C。现有两种操作,一是将科目 X 的公布时间推迟一天同时将 Y 的公布时间提前一天,一次操作不满意度为 A ;二是使科目 X 的公布时间提前一天,一次操作不满意度为 B 。(其中 X,Y 为任意科目)。求最小的不满意度之和。
1≤n,m,ti,bi≤105A,B,C 均为非负整数 。
考虑如果我们知道了最晚的一个科目的公布时间,我们就可以很容易求出不满意度。所以我们枚举最晚的一个科目的公布时间,然后将所有晚于它的科目的时间全部调整为它。然后我们可以根据 A,B 的大小关系分类讨论一下。若 A<B ,就不断用第一种,不够了再用第二种,否则就直接不断用第二种。这个用前缀和维护一下就行,时间复杂度为 O(max{bi}) 。
# T2 相逢是问候
给定 n,m,p,c 。有一个长度为 n 的序列,有 m 个操作,0lr 表示将 ai(l≤i≤r) 都替换成 cai ,1lr 表示查询 [l,r] 内所有数的和 modp 的结果。
1≤n,m≤5×104 ,1≤p≤108 ,0<c,ai<p 。
考虑操作一,形如 ccc⋯ 很容易想到扩展欧拉定理。
ab≡⎩⎪⎪⎨⎪⎪⎧abmodφ(m),ab,abmodφ(m)+φ(m),gcd(a,m)=1gcd(a,m)=1,b≤φ(m)gcd(a,m)=1,b≥φ(m)(modm)
所以我们反复使用扩展欧拉定理,每次都会把 m 变为 φ(m) ,当 φ(m)=1 时,原式变为定值。所以我们不断将 p 变为 φ(p) 直到为 1 后停止,而一个数最多经过 log 次就可以变成 1 ,因为偶数的欧拉函数值必定小于它的一半,而奇数的欧拉函数值必定为偶数,所以我们只需要维护 logp 个幂即可。同时,发现此题涉及到区间操作,考虑用线段树直接维护区间和以及区间最小变换次数即可。这题预处理比较麻烦,我们需要预处理出 ai,j 表示 cc⋯ai (其中下方 c 的个数为 j ),这个直接套用扩展欧拉定理即可,若直接套用快速幂计算,预处理复杂度为 O(nlog3p) ,所以我们替换为光速幂。设定阈值 b ,预处理所有的 px=cx 和 qx=cbx ,则 cx=pxmodb⋅q⌊bx⌋ ,这样省去了快速幂的复杂度。最终总时间复杂度为 O(nlog2p+nlognlogp) 。
# T3 组合数问题
给定正整数 n,p,k,r ,求 ∑i=0∞(ik+rnk)modp 的值。
1≤n≤109 ,0≤r<k≤50 ,2≤p≤230−1 。
可以转变题意,即求在 nk 个物品中选出 x 个,且满足 xmodk=r 的方案数。那我们有一个比较显然的 dp ,设 fi,j 表示当前考虑第 i 个物品,选出的数量 modk=j 的方案数,转移也比较简单。分别考虑是否选这个物品,就有 fi,j=fi−1,j+fi−1,(j−1+k)modk ,时间复杂度为 O(nk2) 。我们发现 n 非常大,而且 fi 的转移只和 fi−1 有关系,我们可以考虑用矩阵乘法优化转移。
[f0f1f2⋯fk−1]×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡110⋮00011⋮00001⋮00⋯⋯⋯⋱⋯⋯000⋮11100⋮01⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
可以构造出形如这样的转移矩阵,初始值 f0=1 ,跑矩阵快速幂即可。时间复杂度O(k3log(nk)) 。
# Day 2
# T1 摧毁 “树状图”
给定一棵 n 个点的树,找到树上的两条边不相交的路径,使得删去路径上的所有点和边后剩下的连通块数量最多,输出最大个数。
n≤5×105 。
大力树形 dp ,我们设 fu,0/1/2/3 表示以 u 为根的子树(包括u )的四种情况。具体地,fu,0 表示链的一个端点为 u ,另一个端点在 u 的子树内,fu,1 表示路径的两个端点在 u 的子树内且路径不经过 u ,fu,2 表示路径的两个端点在 u 的子树内且路径经过 u ,fu,3 表示一条链以 u 为端点,另一个端点在子树内,以及一条路径两端在 u 的子树内且允许经过 u 。
考虑如何转移,以下设 v 为 u 的直接儿子,sonu 表示 u 的儿子数量。
fu,0=max(fu,0,fv,0+sonu−1) ,即连接 u 到 v 的边。
fu,1=max(fu,1,fv,1,fv,2+1) ,直接继承 v 的两种情况。
fu,2=max(fu,2,fu,0+fv,0−1) ,将两条链直接拼起来,注意 fu,0 多算上了 v 为根的连通块,而连接上 v 后就没了,所以要减一。
以下 fu,3 的转移省略 max 符号。
fu,3=fu,0+fv,2−1 直接作为两条路径,fu,0 多统计了 v 的连通块,所以减一。
fu,3=fu,0+fv,1−1 和上面的类似。
fu,3=fu,2+fv,0−1 将 v 到 u 的路径连接起来,减掉 v 的那一个连通块。
fu,3=fv,3+sonu−1 将 v 到 u 的路径连接起来,多了 sonu−1 个连通块。
设 tmp 为之前的儿子中 fv,1 和 fv,2 的最大值,fu,3=fv,0+son[u]−1+tmp−1 。直接根据 fu,3 的意义转移,将 u 和 v 连接,减去 tmp 和 v 的那两个连通块。
由于路径可以退化成链,所以 fu,2=max(fu,2,fu,0) ,fu,3=max(fu,3,fu,2)。
然后考虑答案的更新。
ans=fu,3+fv,0−[u=1] ans=fu,0+fv,3−[u=1] ans=fu,2+fv,1−[u=1] ,其中如果 u 为 1 表示 u 为根,就没有上面产生的那个连通块了。
ans=fu,1+fv,2 ans=fu,1+fv,1−1
对于初始化操作,fu,0=fu,2=fu,3=son[u] 表示只选了 u 这个节点,fu,1=1 表示只选了一个儿子,剩下了一个连通块。
时间复杂度 O(n) 。
# T2 分手是祝愿
给定一个长度为 n 的 01 序列,每次可以操作一个位置 pos ,然后 pos 的所有约数上的位置会取反。当该局面的最小操作步数小于等于 k 时,直接按照最小操作步数的方案操作,否则它会等概率随机一个位置操作。求使最终序列全部变为 0 的操作次数的期望乘上 n! 对 100003 取模之后的结果。
1≤n≤100000 ,0≤k≤n 。
先考虑一个局面的最小操作步数,容易发现 pos 位置只能被大于等于它的位置取反。所以我们就有乐一个贪心,从大到小操作序列中状态为 1 的位置,即可得到最小操作数 x。所以当 k≤x 时期望步数为 x 。然后我们考虑 k>x 的情况。我们又可以发现最小操作方案是和操作顺序无关的,所以我们从操作数上下手。我们定义最小操作数中操作的位置为需要操作的位置,设 fi 表示从需要 i 次操作变为需要 i−1 次操作的期望步数,当随机到的位置为需要的那 i 次操作之一,期望为 ni ;若没有随机到,那么就会变成需要 i+1 次操作的局面,那就需要 fi+1+fi+1 次操作才能变成需要 i−1 次操作的局面(加一表示加上随机的那一个操作)。整理一下可以得到,fi=ni+(1−ni)⋅(fi+1+fi+1) ,解方程可得 fi=i(n−i)⋅fi+1+n ,初始化为 fn=1 ,直接递推即可。最终答案为 k+∑i=k+1xfi 。处理约数可以通过枚举倍数解决,时间复杂度为 O(nlogn) 。
# T3 寿司餐厅
有 n 种寿司,第 i 种寿司的类型为 ai 。如果你吃到了第 i 到第 j 种 (i≤j) 寿司,你的收益为 di,j 。如果你吃了 y 种类型为 x 的寿司,你会付出 mx2+yx 的代价(其中 m 是一个常数)。 最大化价值和。
n≤100 ,ai≤1000 ,m∈{0,1} ,−500≤di,j≤500 。
这是经典的最大权闭合子图问题,考虑用最小割来求解。将每个 di,j 看成一种物品,di,j>0 的从 S 向其连一条容量为 di,j 的边,否则向 T 连边,容量为其相反数。当 i=j 时,若选择了 di,j ,则 di+1,j 和 di,j−1 也要被选择,所以连一条容量为 INF 的边;当 i=j 时,表明就选择了这一种寿司,就向其对应的类型 ai 连边,容量为 INF 。这样我们就刻画了所有的依赖关系,接着我们考虑其余边的容量。我们发现现在只剩下 mx2+yx 的代价没有刻画。mx2 比较简单,我们直接让每种类型的寿司向 T 连一条容量为 mx2 的边。对于 yx ,其和数量有关,我们假设 ai=x ,我们可以让 di,i 减掉 x ,这样 yx 的代价就自动减掉了。最终答案就是所有 di,j>0 的 di,j 之和减去最小割。