2025省选集训
美妙集训。
day1
https://www.becoder.com.cn/contest/5894
A
用支持全局加 1 的 Trie 维护每个点的所有儿子的情况,父亲单独看。
B
观察、打表发现一棵满二叉树的 sg 等于层数的 lowbit。
C
D
观察题解得到一种构造方式:记关键点为被经过次数最多的点,假设一共有
树剖加线段树维护即可。
E
问题等价于平面上有若干
如果没有强制在线我有至少 5 种方法搞定这玩意。
再次转化为对于一组
F
用 2-d tree 的错解:
开一个恒容的堆维护目前的前
正解:
考虑先找出最远点对,然后用其余所有点与它们的
显然我们这
day2
https://www.becoder.com.cn/contest/5897
A
B
发现把置换环拿出来之后如果这个环不在一条直链上就无解。
然后考虑对于每个
发现
然后具体实现就是用一棵平衡树来维护环的分裂。具体的,我们将
C
对每个点,求出子树内最多可以选多少个人,但是自己启发式合并 priority_queue M了,所以打左偏树。
D
发现可以用矩阵维护分子分母的变化,然后发现
然后类比发现
然后 fhq 维护就可以了
day3
https://www.becoder.com.cn/contest/5899
讲了若干玩意。
A
考虑设
转移就枚举从
特殊处理耳朵只有一个新点的情况。
B
先建一棵圆方树,并钦定
否则考虑随便找两个点双极定向出一个拓扑序,找到一个最短的前缀满足
考虑这样的正确性:
D
边三联通。
常用套路:建出 dfs 树,非树边随机赋权,树边的权为所有覆盖它的非树边的权值异或和。
一个边的集合
考虑所有树边:
- 边权为 0,这是割边,子树内外属于不同的连通分量。
- 边权等于某条非树边,该边只被一条非树边覆盖,子树内外属于不同的连通分量。
- 存在某条树边与这条树边边权相等,删去这两条边后中间的部分属于别的连通分量。
为了维护这个东西,可以为连通分量随机赋一个标号,最初所有的标号都相同,1,2两种情况就给子树整体异或一个随机值;情况 3,假设两天树边是
E
A 的有向图版本,先钦定所有的边选择代价小的那边,然后将边权变成
F
考虑原问题的有解的充要条件:
- 将混合图中所有有向边变为无向边后整个图边双连通。
- 将混合图中所有无向边变为两条反向的有向边后这个图强连通。
现在依次考虑图中的每一条双向边
day4
https://www.becoder.com.cn/contest/5900
A
发现如果选了一个点双内的两个点后整个点双都会被选择,所以自然地想到建出圆方树。
发现圆方树上选的点一定是若干联通的方点邻接的所有圆点,然后发现如果重心
发现所有可能的
此情况下
如果
如果
同样发现可能的
如果
如果
day5
模拟赛。
考得稀烂。
A
二分答案。
假设现在二分到的是
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
先按
设
容易发现这玩意是下凸的,并且发现转移是是一个前缀取
二分出这个分界点然后就是对后缀加一个等差数列以及插入一个点,显然可以用平衡树维护。
但是题解给了个 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 序上是连续的。然后就可以用这样一种常数巨大的玩意维护每次对毛毛虫(树上一条链及其一级邻域)的操作。
简单树剖练习题
考虑如果一条边的两个端点都被加了
Poachers
考虑对每棵树算
其中
考虑先给所有叶子挂一个虚点,这样就避免了特判一步删空。
发现这玩意和深度有关,于是我们可以得到一个基于长剖的线性做法。
- 如果
是叶子, 。 - 如果
只有一个儿子 ,考虑其所有后代的 值组成的集合 ,可以发现有 。同时有 ,发现 可以从 暴力往上枚举,对于一整条长链,最多跳 次。 - 如果
有多个儿子,考虑将所有 求出后直接暴力算出 ,复杂度 。
也就是说我们总的复杂度为所有长链的长度之和,即
day8
线性代数好玩,线性代数难。
另开了一篇。
day9
模拟赛,但是完全唐了。
A
首先我们发现这个
考虑到我们求解逆序对时需要知道有多少个数比当前的数小,如果用多项式复杂度的 dp 状态的话显然是记不完备的,所以我们考虑状压前面选的数。
显然
我们可以考虑对于每一个前缀存这个玩意,然后发现状态数是所有段长度的乘积,因为所有段的长度总和最多是
B
随便做。
考虑到
对于区间
仍然考虑分治。
现在一条路径可能长这个样子:
发现它最多会掉头两次,而且都是在第一行到最后一行之间掉头,考虑先预处理出每列向左/向右掉头的最短距离,然后在算最短路时尝试将第 1 行和第 3 行相互更新一下。
然后再跑 3 个二位偏序。
一共 5.8k,不长。
C
最简单的题,考虑反悔贪心或是整体二分优化决策单调 dp 或是闵可夫斯基和随便做。
day10
计数专题,另开了一篇。
day11
模拟赛。
A
赛时想到了贝尔数,但是仍然以为要记录所有的边的状态,遂爆炸。
我们考虑最小生成树的 Kruskal 算法,发现其本质不同的并查集只有
我们考虑先把边拆开,然后按权值从小到大处理所有的边。对于当前的一条边
所以我们考虑对于一条
- 如果
,就拆成 和 两条边,表示选边权小的会多选一条 a 类边。 - 否则拆为
和 两条,表示选边权小的会少选一条 a 类边。
按权值递增排序,相同权值时
这样当我们处理到一条 1 或 -1 的边时可以随便考虑选或不选,然后更新 MST 权值和 a 类边数量。
而当我们遇到一条 0 边时,我们其实可以直接尝试用这条边合并连通块和更新 MST。首先,我们不管选不选这条边都不会更新 a 类边的数量,因为我们是把所有的更新都放在靠前的姊妹边上了的。其次,如果前面选了姊妹边,这次更新不会有任何影响,如果边的两个端点处于两个不同的连通块内又表明前面没有选其姊妹边。总而言之,直接选不会有任何的负面影响。
总复杂度
B
原题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】