Ucup

比赛链接

A

矩乘优化 DP,卡常。

B

题意

给一个正整数序列 A,对 k0N,求 {1,2,,N} 的子集 S 的数量使得 S 有一个子集 T 满足 |S||T|=kiTAiM

分析

不是很好想的 DP。

答案初始为 2n,考虑扣掉不合法的方案数。首先 S 的大小至少为 k

ans=2ni=0k1(nk)

考虑到小于比大于好求,将题意对称转化,计数 S,其所有子集 T 满足 |S||T|=kiTAi<M

定义 f(i,j) 表示选了前 i 个的一部分,和为 j 的方案数,g(i,j) 表示选了前 i 个的一部分,必须选 i,和为 j 的方案数,转移是显然的:

f(i,j)=f(i1,j)+f(i1,jAi)

g(i,j)=f(i1,jAi)

定义 sumi 表示前 i 个数中选和不超过 m 的方案数(必须选 i),则 sumi=jg(i,j)

扣除的第二部分可表示为 i=0nksumi×(nik),表示枚举 T 的范围(必须包含最后一位非常巧妙),在后面剩下的随便选 k 个组成 S

于是可得最终 ans 的表达式。

ans=2ni=0k1(nk)i=0nksumi×(nik)

时间复杂度 O(n×m)

C

题意

甲乙轮流完成 n 项工作,甲做第 i 项工作的时间是 Ai+Bj(甲之前做了 j 项工作),乙做第 i 项工作的时间是 Ci+Dj(乙之前做了 j 项工作)。

求做完的最小时间。

分析

先假设全是甲做的,分开维护 A,B 的贡献 ans1C,D 的贡献 ans2。注意到将第 i 项工作从甲做变为乙做对 ans1 产生 BiAi 的贡献,而 ans2 实际是 C,D 的一段前缀和,可以预处理。

所以可以把 BiAi 插进堆里,每次取出最小值,过程中取 ans1+ans2 的最小值。

时间复杂度 O(nlogn)

H

神秘期望题。

I

题意

求满足 i,AP1++APi=APi+1+APN 的排列 P 的个数。

分析

直接 DP,考虑往等式左右两边填数字。

定义 f(i,j,s) 表示考虑 A 的前 i 位,此时等式左边有 j 个,左边和为 s 的方案数,则有转移:

f(i,j,s)=f(i1,j1,sAi)+f(i1,j,s)

分别表示放在左边或右边,然后滚动数组或倒序转移优化掉第一维就行了。

时间复杂度 O(n4)

K

题意

有一个初始全 0 的序列 H,每次可以选择一段连续的登高序列整体加一。要求序列的差分各项有最小值 D

问最小进行整体加一的步骤数。

分析

考虑 DP。

定义 f(i,j) 表示前 i 个位置,当前高度为 j 的最小花费,枚举某一位是上升还是下降,在下降的时候统计贡献,则有转移:

f(i,j+Di)f(i,j)

f(i,jDi)f(i,j)+Di

L

最先开的一题,居然想到菊花图就不会了,耻辱柱。

题意

给一个不降序列 X,定义图的权值为 i=1nj=i+1nXdis(i,j),构造一个 nm 边的无向图使得图的权值最小。

分析

图的权值和点的编号无关。可以先来一张菊花图,这样保证了最大用到 X2。然后就有多少边连多少边,任意一对距离为 2 的点都会在连边后变为距离为 1。随便怎么连。

时间复杂度 O(m)

M

题意

给长度为 nA,长度为 mB。从 A 中选 m 个组成 CB 匹配,最小化代价 i=1m|BiCi|

分析

定义 f(i,j) 表示在 A 的前 i 个中,B 的前 j 个中选一部分的最小花费.

f(i,j)=min{f(i1,j)f(i1,j1)+|AiBi|

答案是 f(n,m)

作者:tai-chi

出处:https://www.cnblogs.com/tai-chi/p/18449358

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   tai_chi  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示