2025 广铁一中集训

LG P9662

一个有意思的结论是只有 1/k 位置的移动是有用的,记 fi,j 为当 [1,n] 已经做完,并且 j1/k 位置,转移就是找不在前 m 个数中的第一个比 i 大的数 j,转移到 dpj,0/1 上。我们就得到了一个 O(n2) 的做法,考虑优化这个找 j 的过程,预处理一下,短链为环之后倍长数组,扫描长度为 k 的区间,加一个删一个,找到第一个大于区间左、右端点的值,上一棵 Fenwick 就可以了。

LG P9097

简单题,设状态 fi 为前 i 个点使其合法的最小代价,容易写出暴力转移:

fi=min(fi,fj+(ij1))

其中:

0j<i,k=jiak0

发电站不连边,有:

fi=min(fi,fi1)

这个 min 状态中只有 j 与状态有关是比较显然的,提一下式子就只剩下 fjj 了,上个树状数组维护 min 不就可以 logn 地查了。

这个前缀和 0 也可以理解为不能出现供应负电。

LG P7967

神秘,毙掉了我的组合数、容斥、状压,然后一个不那么朴素的设计得到了一个名为“连续段 DP”的美名,震惊。设 fi,j,k 表示前 i 个磁铁,分成了 j 组(我们定义“组”为紧挨着且尽可能靠近的一个紧密相连的连续段),占用 k 个空位,考虑第 i 块磁铁,我们得到:

  • 单独开一个新组:fi,j,kfi1,j1,k1

  • 接在前面一组的一个端点上:fi,j,kfi,j,k+fi1,j,kri×j×2 (kai)

  • 有两个端点连上了:fi,j,kfi1,j+1,k2ri+1×(j+1)×j (k2ri1)

有一篇专门记叙这个东西的 博客

LG P2160

对于这种二元组要求我们可以考虑保留一个限制作为状态,另一个限制作为“内容”来设计状态。设 fi,a,b 表示放置了前 i 本书,第一层和第二层厚度分别为 a,b 时的最小高度。第三层厚度也能算了,若某一层对答案无贡献,即 f0,0,0=0,考虑顺推,先把所有书按高度排序,那么第一个放进空层的书就是这一层的最高高度,显然一本书放进非空层对答案并无贡献,而放进空层反之会有对高度的贡献,最后迭代出 fn,, 后枚举使三层都非空的状态然后保存 Smin。要滚动数组压缩空间,转移的过程中枚举到当前的 w 就可以了。

LG P3891

有一个 O(nt2) 勉强卡过去的方法。因为这个钱是时刻变化的,作为状态记录显然不太现实。我们设 fi,j 为当前钱数为 i,每秒得到 j 的钱,由买不买苦工显然得到两种转移:

  • 不买:fi,j=fi+j,j+1

  • 买:fi,j=fiak,j+bk

从大到小枚举 j,其他枚举顺序没有限制,最后答案存储在 dpm,0 内。

考虑极端情况空间会爆,但是 T103,并且若有任意一秒我们获得的钱数 T 也是可以直接结束的,第二维从 2×1011T,空间复杂度降到了 O(T2)

LG P9823

整个题对于 DP 的设计和转移关键在于能否发现 1 这个特殊的性质。这个东西是排列的说法就在于这个 1 了,即当前答案满足必定是前 k 个内有一个 1,枚举 1 的位置,则前面的位置显然随便填,而这个位置之后又变成了一个新的子问题,终于有转移:

fi=j=1kpi1j1×fij

展开排列得到:

fi=j=1k(i1)!(ij)!×fij=(i1)!×j=1kfij(ij)!

递归维护 fii! 的前缀和即可。

LG P2606

看到这个 pi>pi2,一个训练有素的 DS 选手应该会条件反射地反应出“堆序”或者“建树序”。所以我们将题意转化为 1n 的所有排列中满足小根堆性质的排列个数,设 fi 表示 1i 所有排列中满足小根堆性质的排列个数,我们考虑计算出 i 个节点的完全二叉树中根节点左子树包含的节点数 l 与右子树包含的节点数 r。根节点的值显然必须为 min,考虑剩下的 i1 个节点,就是简单的在 i1 个节点中取出 a 个节点作为左子树,剩下的 b 个作为右子树了,得到一个转移:

fi=(ai1)×fa×fb

这个题计算 binom 需要 Lucas。

LG P8107

讲课时唯一一个没写出来还看不懂题解的题。参考了这个比较精简的 Editorial,需要拉回来 modk 的条件作为状态,然后前缀和优化。但是我没写。

LG P6371

数位 DP 捏,我们直接设 fp,n 表示到 p 位且前面的位数模 Xn 时最终能被 X 整除的数的个数,转移比较常规。但是 X 的取值来到了 1011,数组开不下,若转为 map 维护仍然改变不了无用状态太多的本质问题(不少状态记录下来都为 0),考虑剪枝。设 t=(Xn×10p)modX,设能使用最大数字为 max,则若剩下的 p 位数字全部变为 max 组成后仍然小于 t,那显然搜下去也不可能让模数变为 0,大力剪枝。

LG P4815

这套题里有不少类似这样的东西,抽象关系出来连边建树。比如这个题里的三条特殊限制保证了这张关系图是形如树的集合(无自环、重边、有父亲、儿子关系)。我们对每一张树形图单独做几次 DP,分两种不同类型的边来讨论:

  • “指控”:狼人儿子可以转移到平民父亲,平民父亲可以转移到狼人或者平民父亲

  • “保护”:平民儿子可以转移到平民父亲,狼人儿子可以转移到狼人或者平民父亲

按照这 6 种关系来递推,设 fi,j,k 表示以 i 为根的子树里有 j 个狼人且根节点自身属性为 k0/1 分别表示市民、狼人),得到“指控”中:

fu,j,1=fu,jk,1×fv,k,0(vu)fu,j,0=fu,jk,0×(fv,k,1+fv,k,0)(vu)

“保护”中:

fu,j,1=fu,jk,1×fv,k,1(vu)fu,j,0=fu,jk,0×(fv,k,0+fv,k,1)(vu)

处理森林我们有常用方法超级源点。

LG P4442

t3 下文章,注意到 t=1,t=2 的 case 可以合并,如果没有立刻拿走上面的晶蝶就不可能再次拿到了。而对于 t=3 的情况,我们可以考虑先到其兄弟节点拿晶蝶之后再赶回来拿。设 fx 表示不在 x 上含有晶蝶的情况下 x 的子树可以得到的最多晶蝶数量,记 gx=yxfy

对于节点 x,我们考虑:

  • 立刻拿走某个儿子 y 内的晶蝶并且沿着这棵子树走下去

  • 先拿走某个儿子 y 内的晶蝶,回到 x,再拿走某个 t=3 的儿子 z 的晶蝶,然后继续沿着 z 的子树往下走

所以得到转移:

fx=max(gx+maxyay,gx+maxzy(ay+gyfy+az))

LG P4657

令起点为 u,则每个点被选中的贡献为 vsonufv,设 fi,j,1/0 表示以 i 为根的子树中的链,使用了 j 块磁铁,i 自己 0/1 没放/放了磁铁,转移则在 son 中取出 maxfi,j,0 做贡献,这样做是 O(n2) 的,我们考虑怎么优化这个 fi,j,0fi,j+1,1 的过程:换根。

因为换根时只会影响 x,fax,在 fax 处修改其 f 值,使其作为 x 的子树来贡献。其本质就是扣去 x 作为儿子的贡献,在转移过程中维护最大和与最大值子树不同的次大值,只要不取到最大值来源的子树,其 f 值仍然为最大值,否则为次大值。

LG P8127

操作节点使直接相邻的点颜色取反,推广到无向图上 无多项式时间解法。我们考虑和上个题一样的套路:对一个节点操作时只会对本身、父亲、儿子造成影响,我们不希望在操作时产生“影响父亲”这样麻烦的情况,所以考虑强制钦定只对当前节点的儿子节点操作,将权值放入状态定义,因为儿子的儿子的权值可以通过操作来获得,所以我们只需要知道当前节点和儿子节点的权值,就可以得到状态:

fi,0vali=0,valsoni=0fi,1vali=0,valsoni=1fi,2vali=1,valsoni=0fi,3vali=1,valsoni=1

再次强制钦定全部儿子节点的权值相同且以 i 为根的子树中除了 i 和儿子节点外其余全部节点为 0,转移过程中考虑每棵子树对当前节点答案统计的影响,显然每种状态都有两种转移方式:从相应的位置直接转移过来;一种是对新加的节点做一次操作转移过来。

LG P2465

树上背包。设 fi,j 表示第 i 个节点(包含 i)被二进制下 j 状态的分部占领的最大价值,则:

fi,j=maxfv,j+vali(vsonu&j¯=j¯)

这题的换底公式挺妙的。

LG P9594

第一想法肯定是二分吧。最小化剩余联通块的最大值,考虑二分答案 mid,求树内割掉一些边后剩余连通块点权极差 <mid,最小化割掉的边边权之和。考虑 DP,设 fu,l,r 表示考虑完以 u 为根的子树,其中 u 这个点所在连通块最小值所在点编号为 l,最大值所在点编号为 r 的最小花费。优化一下发现不需要同时记录 min,max,只需要记录二者中的一个,对于二分出来的 mid,对于所有点我们都需要 dfs 出以它为最小值的点,如果两个点的最小值所在点编号相同,那么他们在同一个连通块,转移为:

fu,x=vsonumin(fv,x,fv,y+valu,v)

要求 u 所在连通块最小值编号可以为 xv 同理。复杂度 O(n3logmaxh)O(n2logmaxh)

LG P8595

比较显然的是先进行操作 1 一定不会比先进行操作 2 劣,因为先练的边后面也有可能被炸毁,所以我们可以考虑把每个连通块炸成若干条链,最后再连接起来。考虑对于每个无根树随便取根进行树形 DP。设计状态为最小代价:

fi,0/1/2={0cracked1didn't cracked, linked with 1 son2didn't cracked, linked with 2 sons

LG P6927

分类讨论题,按照 a,b 从大到小、从小到大排序,其实贪心来看无非就是让能变大的先变大然后再考虑变小的。

LG P9847

最短路变形,把传送过程拆成两步无非就是:射一枪来一个传送门再射一枪到另一个传送门,花费 1 单位时间。那整个的选择其实无非就是:走到相邻的格子、传送。

对于传送需要我们枚举起点传送门和终点传送门,在 SPFA 前以 O(n2) 递推预处理出每个点向四个方向直线走最近的墙的距离,走到最近的一个传送门即可,但是传送到每个位置有 3 种方案(起点、终点传送门方向不同),要取 min

LG P5749

一个直观的贪心是每一个点找一个最近的能够匹配的移动过来更新答案,具体可以用区间的交来证明?用 std::vector 从左到右插入尺码为 i 的鞋出现的坐标,我们从后往前找找到相匹配尺码的 vector 中最后一个元素必定最近,但是统计中间剩余的鞋子暴力显然太慢了,考虑上个树桩数组优化。

LG P2218

显然的二分,我们二分其长度 l,对于当前枚举到的 mid 来说,我们可以按顺序枚举当前是第几个长度为 mid 的正方形,枚举完之后就将刚刚所枚举过的包含在里面的树打上被第几个正方形所覆盖的标记。

LG B3904

对于构造题,一个常规的做法是构造出一些性质比较丰富的特例,比如在这道题中的树和菊花。通过证明我们可以得到必定可以在 3 次构造内得出答案,第一次任意构造一棵树 T,第二次对 T 构造出菊花树 T,第三次对菊花树 T 构造出答案 T。冗杂的内容很多。

LG P6843

分类讨论题,题目大意是:给定一棵树和边权,可以在树中加入一条长度为 S 的有向边,求每个叶子能否构造出一条从根节点出发并以其为终点的长度为 K 的路径。分可以直接走、走一次附加边、走很多次附加边来讨论。

LG P7831

本质就是贪心 + Topo,考虑有多少钱时从城市 i 出发一定能一直走下去?当我们的钱数为当前最大的 ri 时可以一直走下去,因为当前的 ri 是全场最大的,且 pi0,所以可以一直走且不存在无法通行的路。所以我们按照 ri 将边排序,每次取出 r 最大的边 ei,设这条边起点为 u,更新 u 的答案取 min,然后判断出边情况删边入队,每轮入队的电重新更新答案,重复这个过程直到没有点。

LG P7298

暴力跑周期,记录下第 i 个位置跑一个周期能到达的位置集合为 si,发现周期完成后还有一部分剩余,用存在剩余时间内能到达的位置集合为 ri,将位置集合存入桶中维护个数,将 i 号节点经过一个周期后的位置记作 pi,易得将 ipi 连边则得到若干个简单环。优化我们暴力插入的过程就能解决这个题目。复杂度为 O(n+k) 的。

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