2025省选集训

美妙集训。

day1

https://www.becoder.com.cn/contest/5894

A

用支持全局加 1 的 Trie 维护每个点的所有儿子的情况,父亲单独看。

B

观察、打表发现一棵满二叉树的 sg 等于层数的 lowbit。

C

D

观察题解得到一种构造方式:记关键点为被经过次数最多的点,假设一共有 k 条路径经过。找出最靠上的一个关键点,将一条以它为 lca 的路径涂色并删去,当 k 发生变化时就换一种颜色。

树剖加线段树维护即可。

E

问题等价于平面上有若干 [a,b]×[b,c](abc) 的带权矩形,求覆盖某个点的所有矩形的权值最大值。

如果没有强制在线我有至少 5 种方法搞定这玩意。

再次转化为对于一组 x,y,求在 [1,x]×[x,y]×[y,n] 范围内点权的最大值,然后 3-d tree。

F

用 2-d tree 的错解:

开一个恒容的堆维护目前的前 k 大,然后枚举每一个点,在树上递归,如果某棵子树内不可能更新答案就跳过。

正解:

考虑先找出最远点对,然后用其余所有点与它们的 2n1 条边更新答案,再把这两个点删去。重复 k 次。

显然我们这 k 次找出来的最远点对不会重复,也就是说现在剩下的所有边的长度都不超过这 k 条选出的直径,它们自然无法更新答案。

day2

https://www.becoder.com.cn/contest/5897

A

B

发现把置换环拿出来之后如果这个环不在一条直链上就无解。

然后考虑对于每个 u,找一个 v 使得它们交换后 uu 所在的置换环上深度最大的点。

发现 v 就是 uaii 的边走到的第一个深度比它大的点。

然后具体实现就是用一棵平衡树来维护环的分裂。具体的,我们将 [u,end] 分裂出来,平衡树上二分出 v,然后将原环变成 [1,u1][v,end][u+1,v1][u],其中 end 原本就是环上深度最大的点。

C

对每个点,求出子树内最多可以选多少个人,但是自己启发式合并 priority_queue M了,所以打左偏树。

D

发现可以用矩阵维护分子分母的变化,然后发现 [a+1110]=[a110]×[1011],也就是说可以用矩阵表达 W 对数列 a 的影响。

然后类比发现 [2110] 可以表达 E。

然后 fhq 维护就可以了

day3

https://www.becoder.com.cn/contest/5899

讲了若干玩意。

A

考虑设 dpS,p,t,0/1 表示现在已经被访问的点的集合为 S,现在这个耳朵加到了 p,钦定这个耳朵以 t 结束的最小代价,并且现在能/否直接走到 t

转移就枚举从 p 走到 k 即可。

特殊处理耳朵只有一个新点的情况。

B

先建一棵圆方树,并钦定 ABC,寻找一个方点满足其子树 siz 最大值 maxsnA。如果 Bmaxs,就直接选这个最大的子树为 B,其余分到 A。

否则考虑随便找两个点双极定向出一个拓扑序,找到一个最短的前缀满足 sxA,然后用前缀中的连通块选出 A,剩下的后缀中选出 B。

考虑这样的正确性:sxA+B,后缀中有 nsxnAB=CB 个点,故满足条件。

D

边三联通。

常用套路:建出 dfs 树,非树边随机赋权,树边的权为所有覆盖它的非树边的权值异或和。

一个边的集合 Ec 是割集当且仅当存在 EEc 满足 xEx=0

考虑所有树边:

  1. 边权为 0,这是割边,子树内外属于不同的连通分量。
  2. 边权等于某条非树边,该边只被一条非树边覆盖,子树内外属于不同的连通分量。
  3. 存在某条树边与这条树边边权相等,删去这两条边后中间的部分属于别的连通分量。

为了维护这个东西,可以为连通分量随机赋一个标号,最初所有的标号都相同,1,2两种情况就给子树整体异或一个随机值;情况 3,假设两天树边是 (u,fu),(v,fv) 那么分别对 uv 的子树整体异或一个随机值。最后所有标号相同的点属于同一个连通分量。

E

A 的有向图版本,先钦定所有的边选择代价小的那边,然后将边权变成 0,|ab|,然后跑类似 A 的 dp。

F

考虑原问题的有解的充要条件:

  • 将混合图中所有有向边变为无向边后整个图边双连通。
  • 将混合图中所有无向边变为两条反向的有向边后这个图强连通。

现在依次考虑图中的每一条双向边 e=(u,v),考虑证明去掉 e 后,u 可达 vv 可达 u 至少满足一条:因为原图是强连通的,所以对于任意 x,必有 u 可达 xv 可达 x。同理有对于任意 xx 可达 ux 可达 v 必满足一条。如果存在一个 x 使得 u 可达 xx 可达 v(或相反的),那就得证了。如果所有的 x 都不满足,稍加观察会发现原图有至少两个强连通分量,就矛盾了。

day4

https://www.becoder.com.cn/contest/5900

A

发现如果选了一个点双内的两个点后整个点双都会被选择,所以自然地想到建出圆方树。

发现圆方树上选的点一定是若干联通的方点邻接的所有圆点,然后发现如果重心 R 没被选的话没有合法方案,所以以重心 R 为根,跑树形 dp。

  • k=0

发现所有可能的 |V| 只有 O(n) 个,尝试枚举一个 lim 为连通块的大小。记 fi 为选择 i 的父亲方点(若 i 是方点就是选它自己)的方案数。

此情况下 fx 取值只有 0 和 1。

如果 x 是圆点,考虑它的所有儿子,如果 sizvlim,显然 v 是需要被选择的,如果 fv=0 就表明无解;若 sizv<lim 说明 v 不能被选择,考虑将所有不能被选的子树的 siz 加起来判断 x 的父亲是否需要选择。

如果 x 是方点,fx=vfv

  • k=1

同样发现可能的 |V| 还是只有 O(n) 种(考虑整除分块)。

如果 x 是圆点,考虑它的所有儿子,如果 sizv>lim,显然 v 是需要被选择的,记所有要选择的 vfv 之积为 S,如果 fv=0 就表明无解;若 sizv<lim 说明 v 不能被选择,考虑将所有不能被选的子树的 siz 加起来记为 tot,如果 sizv=limfv0,那 v 就是可选可不选的,如果不选 v 就要求没有不能选的 v 且其他所有 v 都被选了(就是要求所有的)。fx=[limtotlim+1]S+[tot=1]cnt×S,其中 cnt 是可选的 sizv=limv 的数量。

如果 x 是方点,fx=vfv

day5

模拟赛

考得稀烂。

A

二分答案。

假设现在二分到的是 x,我们把所有权值不超过 x 的操作设为可执行,然后跑 bool 类型的区间 dp,用 bitset 优化到 O(n3lognω)

for(int i=1;i<=n;i++)f[i].reset();
for(int i=1;i<=n;i++){
	for(int j=i-2;j>=0;j--){
		if(!f[i][j]&&cost[i][j]<=x&&(j==i-2||f[i-1][j+1])){
			f[i][j]=1;
			f[i]|=f[j];
		}
	}
}

B

先按 b 从大到小排序,正确性显然。

fi,j 表示前 i 个元素选 j 个最小的 sum,有:

fi,j=min(fi1,j,fi1,j1+ai+(j1)×bi)

容易发现这玩意是下凸的,并且发现转移是是一个前缀取 fi1,j,剩下的后缀取 fi1,j1+ai+(j1)×bi

二分出这个分界点然后就是对后缀加一个等差数列以及插入一个点,显然可以用平衡树维护。

但是题解给了个 KTT,嗯。

后面补。

C

神奇结论题,具体还是看 spdarkle 的博客 吧。

day6~9

dj 讲课、模拟赛、放假。

https://www.becoder.com.cn/contest/5904
https://www.becoder.com.cn/contest/5906
https://www.becoder.com.cn/contest/5915


讲课内容是树上问题的处理技巧,包括但不限于:毛毛虫剖分、点分治、链分治、长剖优化dp等。

模拟赛考得稀烂。


轻重边

  • Sol1

考虑给每个点赋一个标记,将每次操作转换成链上的标记赋值,从而将轻重边的判定转换为判定边的两个端点的标记是否相同。树剖维护即可。

  • Sol2

毛毛虫剖分,我们考虑原先得到 dfn 序的过程,考虑每次将重链遍历后在依次遍历所有链上节点的邻接点,然后再遍历其他重链。容易发现这样遍历后,每条重链除去链头后链和链的所有邻接点在 dfn 序上是连续的。然后就可以用这样一种常数巨大的玩意维护每次对毛毛虫(树上一条链及其一级邻域)的操作。

简单树剖练习题

考虑如果一条边的两个端点都被加了 k 那么边权总增量就是 2k|auav|,考虑树剖,然后每次修改时改 log 条链,以及 O(log) 次单点修改;查询时重边在线段树上查,轻边暴力 O(1) 算。总复杂度 O(nlog2)

Poachers

考虑对每棵树算 sg 值,容易发现有 {dpx,0=mexi=1limxdpx,idpx,i=vdpvi1(i>0)

其中 dpx,i 表示以 x 子树中距 x 距离为 i 的所有点为根的子树的 sg 的异或和,limx 表示 x 子树中离 x 最近的叶子的距离。

考虑先给所有叶子挂一个虚点,这样就避免了特判一步删空。

发现这玩意和深度有关,于是我们可以得到一个基于长剖的线性做法。

  • 如果 x 是叶子,sgx=dpx,0=0
  • 如果 x 只有一个儿子 v,考虑其所有后代的 sg 值组成的集合 Sx,可以发现有 Sx=Sv{sgv}。同时有 sgx=mexSx,发现 sgx 可以从 sgv 暴力往上枚举,对于一整条长链,最多跳 Θ(len) 次。
  • 如果 x 有多个儿子,考虑将所有 dpx,i 求出后直接暴力算出 sgx,复杂度 Θ(limx)

也就是说我们总的复杂度为所有长链的长度之和,即 n

day8

线性代数好玩,线性代数难。

另开了一篇

day9

模拟赛,但是完全唐了。

A

首先我们发现这个 n 只有 35,考虑正解复杂度要么是一个奇葩多项式要么就是一个抽象的指数函数。

考虑到我们求解逆序对时需要知道有多少个数比当前的数小,如果用多项式复杂度的 dp 状态的话显然是记不完备的,所以我们考虑状压前面选的数。

显然 2n 的状态是过不了的,我们考虑对于还没有选的数,它们会把数轴分成若干段,我们实际上并不考虑段内的具体选了什么数,只关心段里面一共选了多少。

我们可以考虑对于每一个前缀存这个玩意,然后发现状态数是所有段长度的乘积,因为所有段的长度总和最多是 n,所以根据一个人尽皆知的结论有总状态数最多大约在 3n3 的量级,那总复杂度就是 O(n3n3)

B

  • n=1

随便做。

  • n=2

考虑到 n=2 时我们的路线不会掉头,因此我们考虑分治。

对于区间 [l,r],我们考虑计算跨过 midmid+1 的所有路径的长度,算出 (1,mid),(2,mid)lmid 之间的所有点的最短路,同时算出 (1,mid+1),(2,mid+1)mid+1r 之间所有点的最短路,然后我们就是要求一个 x,ymin(ax+ay,bx+by) 的一个玩意,移项后就是比较 axbxbyay 的大小,一个简单的一维偏序。

  • n=3

仍然考虑分治。

现在一条路径可能长这个样子:

发现它最多会掉头两次,而且都是在第一行到最后一行之间掉头,考虑先预处理出每列向左/向右掉头的最短距离,然后在算最短路时尝试将第 1 行和第 3 行相互更新一下。

然后再跑 3 个二位偏序。

一共 5.8k,不长。

C

最简单的题,考虑反悔贪心或是整体二分优化决策单调 dp 或是闵可夫斯基和随便做。

day10

计数专题,另开了一篇。

day11

模拟赛。

A

赛时想到了贝尔数,但是仍然以为要记录所有的边的状态,遂爆炸。

我们考虑最小生成树的 Kruskal 算法,发现其本质不同的并查集只有 Belln 种,当 n=9 时,这个值大概两万多一点。所以考虑依据这个进行 dp。

我们考虑先把边拆开,然后按权值从小到大处理所有的边。对于当前的一条边 (u,v,w),如果它的姊妹边在后面,它可选可不选,如果选的话就要考虑对 a 类边数量的更新以及连通块的合并。如果不选就表明后面的姊妹边一定要选。

所以我们考虑对于一条 (u,v,a,b) 的边:

  • 如果 ab,就拆成 (u,v,a,1)(u,v,b,0) 两条边,表示选边权小的会多选一条 a 类边。
  • 否则拆为 (u,v,b,1)(u,v,a,0) 两条,表示选边权小的会少选一条 a 类边。

按权值递增排序,相同权值时 id=0 的边排在后面。

这样当我们处理到一条 1 或 -1 的边时可以随便考虑选或不选,然后更新 MST 权值和 a 类边数量。

而当我们遇到一条 0 边时,我们其实可以直接尝试用这条边合并连通块和更新 MST。首先,我们不管选不选这条边都不会更新 a 类边的数量,因为我们是把所有的更新都放在靠前的姊妹边上了的。其次,如果前面选了姊妹边,这次更新不会有任何影响,如果边的两个端点处于两个不同的连通块内又表明前面没有选其姊妹边。总而言之,直接选不会有任何的负面影响。

总复杂度 O(Bellnm2+Bellnnm)

B

原题。

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