2017六省联考题解

Day 1


T1 期末考试

​ 有 n 个同学,m 个科目。每个科目计划在 bi 天公布成绩,第 i 位同学希望在第 ti 天及以前知道所有科目的成绩,假如最晚的一个科目公布时间为 t ,则其不满意度为 max(0,tti)×C。现有两种操作,一是将科目 X 的公布时间推迟一天同时将 Y 的公布时间提前一天,一次操作不满意度为 A ;二是使科目 X 的公布时间提前一天,一次操作不满意度为 B 。(其中 X,Y 为任意科目)。求最小的不满意度之和。

1n,m,ti,bi105A,B,C 均为非负整数 。


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


T2 相逢是问候

​ 给定 n,m,p,c 。有一个长度为 n 的序列,有 m 个操作,0lr 表示将 ai(lir) 都替换成 cai1lr 表示查询 [l,r] 内所有数的和 modp 的结果。

1n,m5×1041p1080<c,ai<p


考虑操作一,形如 ccc 很容易想到扩展欧拉定理。

ab{ab;mod;φ(m),gcd(a,m)=1 ab,gcd(a,m)1,bφ(m) ab;mod;φ(m)+φ(m),gcd(a,m)1,bφ(m)(modm)

所以我们反复使用扩展欧拉定理,每次都会把 m 变为 φ(m) ,当 φ(m)=1 时,原式变为定值。所以我们不断将 p 变为 φ(p) 直到为 1 后停止,而一个数最多经过 log 次就可以变成 1 ,因为偶数的欧拉函数值必定小于它的一半,而奇数的欧拉函数值必定为偶数,所以我们只需要维护 logp 个幂即可。同时,发现此题涉及到区间操作,考虑用线段树直接维护区间和以及区间最小变换次数即可。这题预处理比较麻烦,我们需要预处理出 ai,j 表示 ccai (其中下方 c 的个数为 j ),这个直接套用扩展欧拉定理即可,若直接套用快速幂计算,预处理复杂度为 O(nlog3p) ,所以我们替换为光速幂。设定阈值 b ,预处理所有的 px=cxqx=cbx ,则 cx=pxmodbqxb ,这样省去了快速幂的复杂度。最终总时间复杂度为 O(nlog2p+nlognlogp)


T3 组合数问题

​ 给定正整数 n,p,k,r ,求 (i=0Cnkik+r)modp 的值。

1n1090r<k502p2301


可以转变题意,即求在 nk 个物品中选出 x 个,且满足 xmodk=r 的方案数。那我们有一个比较显然的 dp ,设 fi,j 表示当前考虑第 i 个物品,选出的数量 modk=j 的方案数,转移也比较简单。分别考虑是否选这个物品,就有 fi,j=fi1,j+fi1,(j1+k)modk ,时间复杂度为 O(nk2) 。我们发现 n 非常大,而且 fi 的转移只和 fi1 有关系,我们可以考虑用矩阵乘法优化转移。

[f0f1f2fk1]×[1000111000011000001000011]

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


Day 2


T1 摧毁“树状图”

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

n5×105


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

image

考虑如何转移,以下设 vu 的直接儿子,sonu 表示 u 的儿子数量。

fu,0=max(fu,0,fv,0+sonu1) ,即连接 uv 的边。

fu,1=max(fu,1,fv,1,fv,2+1) ,直接继承 v 的两种情况。

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

image

以下 fu,3 的转移省略 max 符号。

fu,3=fu,0+fv,21 直接作为两条路径,fu,0 多统计了 v 的连通块,所以减一。

fu,3=fu,0+fv,11 和上面的类似。

fu,3=fu,2+fv,01vu 的路径连接起来,减掉 v 的那一个连通块。

fu,3=fv,3+sonu1vu 的路径连接起来,多了 sonu1 个连通块。

tmp 为之前的儿子中 fv,1fv,2 的最大值,fu,3=fv,0+son[u]1+tmp1 。直接根据 fu,3 的意义转移,将 uv 连接,减去 tmpv 的那两个连通块。

image

由于路径可以退化成链,所以 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] ,其中如果 u1 表示 u 为根,就没有上面产生的那个连通块了。

ans=fu,1+fv,2 ans=fu,1+fv,11

image

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

时间复杂度 O(n)


T2 分手是祝愿

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

1n1000000kn


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


T3 寿司餐厅

​ 有 n 种寿司,第 i 种寿司的类型为 ai 。如果你吃到了第 i 到第 j(ij) 寿司,你的收益为 di,j 。如果你吃了 y 种类型为 x 的寿司,你会付出 mx2+yx 的代价(其中 m 是一个常数)。 最大化价值和。

n100ai1000m{0,1}500di,j500


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

posted @   YC乌龙  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示