2017 年六省联考简要题解

# Day 1


# T1 期末考试

​ 有 nn 个同学,mm 个科目。每个科目计划在 bib_i 天公布成绩,第 ii 位同学希望在第 tit_i 天及以前知道所有科目的成绩,假如最晚的一个科目公布时间为 tt ,则其不满意度为 max(0,tti)×Cmax(0,t-t_i)\times C。现有两种操作,一是将科目 XX 的公布时间推迟一天同时将 YY 的公布时间提前一天,一次操作不满意度为 AA ;二是使科目 XX 的公布时间提前一天,一次操作不满意度为 BB 。(其中 X,YX,Y 为任意科目)。求最小的不满意度之和。

1n,m,ti,bi105A,B,C1\le n,m,t_i,b_i\le 10^5 \; \; A,B,C 均为非负整数 。


考虑如果我们知道了最晚的一个科目的公布时间,我们就可以很容易求出不满意度。所以我们枚举最晚的一个科目的公布时间,然后将所有晚于它的科目的时间全部调整为它。然后我们可以根据 A,BA,B 的大小关系分类讨论一下。若 A<BA<B ,就不断用第一种,不够了再用第二种,否则就直接不断用第二种。这个用前缀和维护一下就行,时间复杂度为 O(max{bi})O(\max \lbrace b_i \rbrace)

# T2 相逢是问候

​ 给定 n,m,p,cn,m,p,c 。有一个长度为 nn 的序列,有 mm 个操作,0lr0 \;l\;r 表示将 ai(lir)a_i(l\le i\le r) 都替换成 caic^{a_i}1lr1\; l\; r 表示查询 [l,r][l,r] 内所有数的和 modpmod\; p 的结果。

1n,m5×1041\le n,m\le 5\times 10^41p1081\le p\le 10^80<c,ai<p0<c,a_i<p


考虑操作一,形如 cccc^{c^{c\cdots}} 很容易想到扩展欧拉定理。

ab{abmodφ(m),gcd(a,m)=1ab,gcd(a,m)1,bφ(m)abmodφ(m)+φ(m),gcd(a,m)1,bφ(m)(modm)a^b \equiv \begin{cases} a^{b\bmod\varphi(m)},&\text{$\gcd(a,m)=1$}\\ a^b,&\text{$\gcd(a,m)\ne1,b\le \varphi(m)$}\\ a^{b\bmod\varphi(m)+\varphi(m)},&\text{$\gcd(a,m)\ne1,b\ge\varphi(m)$} \end{cases} \pmod{m}

所以我们反复使用扩展欧拉定理,每次都会把 mm 变为 φ(m)\varphi(m) ,当 φ(m)=1\varphi(m)=1 时,原式变为定值。所以我们不断将 pp 变为 φ(p)\varphi(p) 直到为 11 后停止,而一个数最多经过 log\log 次就可以变成 11 ,因为偶数的欧拉函数值必定小于它的一半,而奇数的欧拉函数值必定为偶数,所以我们只需要维护 logp\log p 个幂即可。同时,发现此题涉及到区间操作,考虑用线段树直接维护区间和以及区间最小变换次数即可。这题预处理比较麻烦,我们需要预处理出 ai,ja_{i,j} 表示 ccaic^{c^{\cdots ^{a_i}}} (其中下方 cc 的个数为 jj ),这个直接套用扩展欧拉定理即可,若直接套用快速幂计算,预处理复杂度为 O(nlog3p)O(n\log^3p) ,所以我们替换为光速幂。设定阈值 bb ,预处理所有的 px=cxp_x=c^xqx=cbxq_x=c^{b^x} ,则 cx=pxmodbqxbc^x=p_{x \, mod\, b }\cdot q_{\lfloor\frac{x}{b}\rfloor } ,这样省去了快速幂的复杂度。最终总时间复杂度为 O(nlog2p+nlognlogp)O(n\log^2p+n\log n\log p)

# T3 组合数问题

​ 给定正整数 n,p,k,rn,p,k,r ,求 i=0(nkik+r)modp\sum_{i=0}^{\infty} {\binom{nk}{ik+r}} \bmod p 的值。

1n1091\le n\le 10^90r<k500\le r<k\le 502p23012\le p\le 2^{30}-1


可以转变题意,即求在 nknk 个物品中选出 xx 个,且满足 xmodk=rx \; mod \;k =r 的方案数。那我们有一个比较显然的 dpdp ,设 fi,jf_{i,j} 表示当前考虑第 ii 个物品,选出的数量 modk=jmod \; k=j 的方案数,转移也比较简单。分别考虑是否选这个物品,就有 fi,j=fi1,j+fi1,(j1+k)modkf_{i,j}=f_{i-1,j}+f_{i-1,(j-1+k)\,mod\,k} ,时间复杂度为 O(nk2)O(nk^2) 。我们发现 nn 非常大,而且 fif_i 的转移只和 fi1f_{i-1} 有关系,我们可以考虑用矩阵乘法优化转移。

[f0f1f2fk1]×[1000111000011000001000011]\left[ \begin{matrix} f_0&f_1&f_2&\cdots &f_{k-1} \end{matrix} \right] \times \left[ \begin{matrix} 1&0&0&\cdots&0&1\\ 1&1&0&\cdots&0&0\\ 0&1&1&\cdots&0&0\\ \vdots&\vdots&\vdots&\ddots&\vdots&\vdots\\ 0&0&0&\cdots&1&0\\ 0&0&0&\cdots&1&1 \end{matrix} \right]

可以构造出形如这样的转移矩阵,初始值 f0=1f_0=1 ,跑矩阵快速幂即可。时间复杂度O(k3log(nk))O(k^3\log(nk))

# Day 2


# T1 摧毁 “树状图”

​ 给定一棵 nn 个点的树,找到树上的两条边不相交的路径,使得删去路径上的所有点和边后剩下的连通块数量最多,输出最大个数。

n5×105n\le5\times10^5


大力树形 dpdp ,我们设 fu,0/1/2/3f_{u,0/1/2/3} 表示以 uu 为根的子树(包括uu )的四种情况。具体地,fu,0f_{u,0} 表示链的一个端点为 uu ,另一个端点在 uu 的子树内,fu,1f_{u,1} 表示路径的两个端点在 uu 的子树内且路径不经过 uufu,2f_{u,2} 表示路径的两个端点在 uu 的子树内且路径经过 uufu,3f_{u,3} 表示一条链以 uu 为端点,另一个端点在子树内,以及一条路径两端在 uu 的子树内且允许经过 uu

考虑如何转移,以下设 vvuu 的直接儿子,sonuson_u 表示 uu 的儿子数量。

fu,0=max(fu,0,fv,0+sonu1)f_{u,0}=\max(f_{u,0},f_{v,0}+son_u-1) ,即连接 uuvv 的边。

fu,1=max(fu,1,fv,1,fv,2+1)f_{u,1}=\max(f_{u,1},f_{v,1},f_{v,2}+1) ,直接继承 vv 的两种情况。

fu,2=max(fu,2,fu,0+fv,01)f_{u,2}=\max(f_{u,2},f_{u,0}+f_{v,0}-1) ,将两条链直接拼起来,注意 fu,0f_{u,0} 多算上了 vv 为根的连通块,而连接上 vv 后就没了,所以要减一。

以下 fu,3f_{u,3} 的转移省略 maxmax 符号。

fu,3=fu,0+fv,21f_{u,3}=f_{u,0}+f_{v,2}-1 直接作为两条路径,fu,0f_{u,0} 多统计了 vv 的连通块,所以减一。

fu,3=fu,0+fv,11f_{u,3}=f_{u,0}+f_{v,1}-1 和上面的类似。

fu,3=fu,2+fv,01f_{u,3}=f_{u,2}+f_{v,0}-1vvuu 的路径连接起来,减掉 vv 的那一个连通块。

fu,3=fv,3+sonu1f_{u,3}=f_{v,3}+son_u-1vvuu 的路径连接起来,多了 sonu1son_u-1 个连通块。

tmptmp 为之前的儿子中 fv,1f_{v,1}fv,2f_{v,2} 的最大值,fu,3=fv,0+son[u]1+tmp1f_{u,3}=f_{v,0}+son[u]-1+tmp-1 。直接根据 fu,3f_{u,3} 的意义转移,将 uuvv 连接,减去 tmptmpvv 的那两个连通块。

由于路径可以退化成链,所以 fu,2=max(fu,2,fu,0)f_{u,2}=max(f_{u,2},f_{u,0})fu,3=max(fu,3,fu,2)f_{u,3}=max(f_{u,3},f_{u,2})

然后考虑答案的更新。

ans=fu,3+fv,0[u=1]ans=f_{u,3}+f_{v,0}-[u=1] ans=fu,0+fv,3[u=1]ans=f_{u,0}+f_{v,3}-[u=1] ans=fu,2+fv,1[u=1]ans=f_{u,2}+f_{v,1}-[u=1] ,其中如果 uu11 表示 uu 为根,就没有上面产生的那个连通块了。

ans=fu,1+fv,2ans=f_{u,1}+f_{v,2} ans=fu,1+fv,11ans=f_{u,1}+f_{v,1}-1

对于初始化操作,fu,0=fu,2=fu,3=son[u]f_{u,0}=f_{u,2}=f_{u,3}=son[u] 表示只选了 uu 这个节点,fu,1=1f_{u,1}=1 表示只选了一个儿子,剩下了一个连通块。

时间复杂度 O(n)O(n)

# T2 分手是祝愿

​ 给定一个长度为 nn 的 01 序列,每次可以操作一个位置 pospos ,然后 pospos 的所有约数上的位置会取反。当该局面的最小操作步数小于等于 kk 时,直接按照最小操作步数的方案操作,否则它会等概率随机一个位置操作。求使最终序列全部变为 0 的操作次数的期望乘上 n!n!100003100003 取模之后的结果。

1n1000001\le n\le 1000000kn0\le k\le n


​ 先考虑一个局面的最小操作步数,容易发现 pospos 位置只能被大于等于它的位置取反。所以我们就有乐一个贪心,从大到小操作序列中状态为 11 的位置,即可得到最小操作数 xx。所以当 kxk\le x 时期望步数为 xx 。然后我们考虑 k>xk>x 的情况。我们又可以发现最小操作方案是和操作顺序无关的,所以我们从操作数上下手。我们定义最小操作数中操作的位置为需要操作的位置,设 fif_i 表示从需要 ii 次操作变为需要 i1i-1 次操作的期望步数,当随机到的位置为需要的那 ii 次操作之一,期望为 in\frac{i}{n} ;若没有随机到,那么就会变成需要 i+1i+1 次操作的局面,那就需要 fi+1+fi+1f_{i+1}+f_i+1 次操作才能变成需要 i1i-1 次操作的局面(加一表示加上随机的那一个操作)。整理一下可以得到,fi=in+(1in)(fi+1+fi+1)f_i=\frac{i}{n}+(1-\frac{i}{n})\cdot(f_{i+1}+f_i+1) ,解方程可得 fi=(ni)fi+1+nif_i=\frac{(n-i)\cdot f_{i+1}+n}{i} ,初始化为 fn=1f_n=1 ,直接递推即可。最终答案为 k+i=k+1xfik+\sum_{i=k+1}^{x} f_i 。处理约数可以通过枚举倍数解决,时间复杂度为 O(nlogn)O(n\log n)

# T3 寿司餐厅

​ 有 nn 种寿司,第 ii 种寿司的类型为 aia_i 。如果你吃到了第 ii 到第 jj(ij)(i\le j) 寿司,你的收益为 di,jd_{i,j} 。如果你吃了 yy 种类型为 xx 的寿司,你会付出 mx2+yxmx^2+yx 的代价(其中 mm 是一个常数)。 最大化价值和。

n100n \le 100ai1000a_i\le 1000m{0,1}m \in \lbrace 0,1\rbrace500di,j500-500\le d_{i,j} \le 500


这是经典的最大权闭合子图问题,考虑用最小割来求解。将每个 di,jd_{i,j} 看成一种物品,di,j>0d_{i,j}>0 的从 SS 向其连一条容量为 di,jd_{i,j} 的边,否则向 TT 连边,容量为其相反数。当 iji\ne j 时,若选择了 di,jd_{i,j} ,则 di+1,jd_{i+1,j}di,j1d_{i,j-1} 也要被选择,所以连一条容量为 INFINF 的边;当 i=ji = j 时,表明就选择了这一种寿司,就向其对应的类型 aia_i 连边,容量为 INFINF 。这样我们就刻画了所有的依赖关系,接着我们考虑其余边的容量。我们发现现在只剩下 mx2+yxmx^2+yx 的代价没有刻画。mx2mx^2 比较简单,我们直接让每种类型的寿司向 TT 连一条容量为 mx2mx^2 的边。对于 yxyx ,其和数量有关,我们假设 ai=xa_i=x ,我们可以让 di,id_{i,i} 减掉 xx ,这样 yxyx 的代价就自动减掉了。最终答案就是所有 di,j>0d_{i,j}>0di,jd_{i,j} 之和减去最小割。

更新于

请我喝[茶]~( ̄▽ ̄)~*

YC乌龙 微信支付

微信支付

YC乌龙 支付宝

支付宝

YC乌龙 贝宝

贝宝