8月记录
237.Hitori的字符串(string)
AC
自动机上随机游走问题,但是叶子 个,有环。
考虑设元然后高斯消元,但对每个点设显然不优,考虑一种链剖分,对链顶设元。
然后按照 bfs
序(trie
树上的)维护每个点期望的表示(用元表示)。
如果 是返祖边,显然深度比 小,一定被表示了。
否则一定是链顶,可以被表示。
或者将度数 的点设为关键点也能做,没细想。
238.Hitori玩游戏(nim)
考虑随机化,将一种方案的权值记为线性基中自由元个数。
每次取出一个集合,删掉选的数,选一个新的数,如果权值减小了,就替换当前方案,如果相等,就以一定概率替换。
将集合元素按照 的个数多少排序,shuffle
一下选择集合顺序即可。
239.Hitori摘樱桃(cherry)
根据小凯的疑惑,只有两个数 ,满足 ,那么 是最大的不能被表示的数。
证明可以考虑同余最短路,在模 的意义下 ,求出 表示 的最小能表示的数,将 取 即可。
考虑这个图,就是一个环,可以手动模拟求出。
多个数也是一样的,求出所有数的 ,记 ,那么 ,在 之后,所有数( 的倍数)都能被表示。
对于 的数暴力背包, 的数每个 的倍数都能被表示,我们相当于要求 。
倍增 NTT
即可维护,每次缩减长度。
注意,可以计算所有数到离他最近的 的距离,即后面这一部分,然后在前面背包的部分在加上每个数离他最近的 到离他最近的可以取到的数的距离。
240.Min-25筛
复习一下。
条件是质数位置和质数次方答案可以快速算。
先考虑求 ,其中 。
设 ,其中 在质数处取值与 相同,然后是完全积性函数,可以快速求前缀和。
边界是 ,如果质数取值是一个简单多项式,对每一项分别求即可。
-
若 ,则 ,因为没有最小质因子 的合数。
-
否则,下面式子表示减去最小质因子为 的数的函数和:
-
我们可以对每一个 ,维护值,将第一位滚掉。
这一部分是如下复杂度。
考虑用 求出所有 的和。
设 ,答案为 。
则:
左边是质数的贡献,右边是合数的,枚举合数的最小质因子还有次数,直接递归,不用记忆化。
241.士兵游戏(soldier)
考虑每条边的贡献,答案为 。
对于 的质数 ,子树大小为 ,需要求区间质数个数,min25
即可。
对于 的质数 ,有:
可以整除分块维护,中间两部分相当于特殊的 min25
其中一部分,可以做到 。
242.无理数乘法
这么 nb
发现 是整数,并且 是一个在 且不为 的小数,所以求出 ,判断奇偶,就能知道 了,并且 可以递推,矩阵优化。
243.#D. 整型与布尔型的转换
有启发性的题。
做一遍标记的复合。
244.CF1982
E
记 表示区间 的答案。
则答案最高位拆分,假设是 ,则 \(f_{0,n-1,k}=f_{0,2^t-1,k)+f_{0,n-2^t-1,k-1}\)。
左端点都是 ,可以预处理出 的所有取值,求任意 时单侧递归即可。
F
考虑找到极长合法前缀,左端点肯定在这里面,找到后缀的 ,找到前缀中最前的 的就是左端点了,后缀同理。
线段树上二分即可。
245.CF1993
有jb
D
挺好想的,二分中位数,dp
一下,记前缀取了 段,当前点是右端点的答案,发现前缀可能段数是 。
E
考虑到扩展矩阵到第 行,第 列,操作就变成了交换第 行与第 行和交换第 列与第 列。
其实也等价于任意交换两行或两列。
发现找到行的排列和列的排列,每次操作相当于交换行排列任意两个数,列同理。
然后发现知道行排列和列排列就能知道原矩阵了,因为交换的顺序不会影响最后矩阵的排布,一定是 。
并且知道了行排列就能知道相邻行的差了,不管列排列是什么,列同理。
于是状压一下,记录当前选了哪些点,以及最后选的点是什么,后面加上一个点。
若我们枚举删除了哪个行,然后在剩下的行中计算列排列的贡献,删除列的情况可以在状态中体现,列同理。
时间复杂度 。
F2
F1 就是先将矩形镜面对称一下,就变成循环矩阵了,将路径在循环矩阵上跑一跑,固定起点,可以快速计算 有多少个点。
考虑 F2,可以将满足条件的点 写成关于次数 和起点 的两个同余方程,解出关于 的通解来,合并一下即可。
Hitori的旅行(journey)
考虑用多项式描述背包,记 。
则点 答案为:
前一项表示三条路径任选,中间项表示钦定两条相等,即算出至少一对相等的方案数,系数是 。
然后至少两对相等的方案数是 ,最后至少三对相等的方案数是 。
只是从容斥的角度考虑,至少两对相等就等于至少三对相等,但是要合并系数。
然后现在题目变成了,逆拓扑序处理 ,在每个点 做个卷积,将各项系数求和,做卷积的复杂度太高。
设 这几个值带入,卷积就是 的了,可以求出 时,答案多项式的值。
将他插回来就行了。
246.hdu 2024“钉耙编程”中国大学生算法设计超级联赛(6)
A. 造花(简单版)
删去的点度数一定是 ,且合法的图中满足度数是 的点有很多,度数为 的点极少,对这些点判断即可。
B. 造花(困难版)
考虑一条边 ,存在 且 相连,且存在 且 相连( 可以等于 ),则一定要在这里删一个。
否则就是三元环或者长度为 的链。
若没有,那么原图无环,且最长链 ,一定合法。
E. 交通管控
记 表示使用前 个操作,红绿灯的状态,容易转移。
G. 树上 MEX 问题
考虑计算 的方案数。
找到必须包含的关键点 构成的虚树,如果 在虚树上,则 。
否则,将 加入虚树(不断跳父亲),计算贡献,考虑 的联通块数量就是所有 ,满足 与虚树有连边且 不在虚树上的 的乘积, 表示 子树包含 的联通块数量,容易预处理。
H. 树形 DNA
看作一个字符集为 的 trie
,可以将 分解为 个字符串构成的 trie
,字符串集合为 。
记 表示 的 级祖先。
假设当前在 的 trie
上的节点 ,若存在 ,满足 是 到根的字符串的后缀,则 ,若存在 ,就是合法点,可以哈希。
I. 数字加减
可以看懂,根本无法写。
相当于每个时刻值域上有一些线段,每过一个时刻,线段往左右扩张 格,会合并,限制相当于删除。
颜色段均摊,每个线段维护中心点和半径可以简化。
J.Rikka 与子集 IV
类似题:[ABC269Ex] Antichain
合并是类似多项式卷积的形式,考虑描述,。
每个多项式大小跟子树大小有关,考虑将重儿子和轻儿子分开计算。
则 可以考虑分治 NTT
维护乘积,轻子树大小总和是 的,一个轻子树跟父亲合并,要分治 层,每层 的复杂度,所以是 的。
对于 ,考虑一条重链一起算。
展开后发现只需要维护前缀乘积的和,依旧是分治 ntt
,每个多项式依旧是轻子树大小。
这样能做类似题,但是这题需要求出重链上所有 的系数和。
考虑即为区间乘积的和,也可以分治 ntt
维护。
就做完了,时间复杂度 。
K. 天天爱跑步
给一棵基环树,对每个点 ,求过 的最长简单路径。
数据范围:。
容易口胡。
247.P10560 [ICPC2024 Xi'an I] Holes and Balls
类似题、弱化题:P4364 [九省联考 2018] IIIDX
考虑按位贪心,找到当前位最小能填的数,满足能填下,就填。
一个位置要填编号为 的球,有什么条件:
-
没被选;
-
大于父亲球的编号
-
编号 的球能全部塞进 的子树外。
考虑条件二,相当于钦定 的下界,条件三就是钦定 的上界。
考虑找到上界,记 表示 和 的祖先已填球的编号的最大值,。
贪心,考虑将 子树外的点按照 排序,将 填入,此时已经确定的点一定能填入自己的数。
若贪心过程不合法,一定存在一个 ,则维护 ,二分找到满足 的最大 就是上界了。
找答案就是在区间中找未被选的最大权值数,关于 的修改,一个全未选子树的 的相同的,容易维护。
维护两棵线段树做到 。
248.CF1989
E
用段数来映射 数组,。
然后开头结尾可以有长度为 的段,中间不行,会和两个 重复,dp
即可。
F
hot!
类似题:P5163 WD与地图
问题相当于每个时刻加一条有向边,求当前时刻强联通分量大小平方的和。
考虑分治维护,求出中间时刻的强联通分量,即 时刻前的边,如条边两端点在同一个强联通分量内,将他插入左边子区间,其他边插入右边子区间,表示这些边不可能在 时两端点在同一个强联通分量内。
分治到了叶子,每个点存的边就是会改变强联通分量的边,用并查集维护联通块大小平方的和即可。
注意当前处理区间 的边,需要将边的两端点改为联通块的关键点,即 处理完后的联通块,因为每次要考虑联通块的合并,不是真实点的合并,不然复杂度就不对了。
249.P10766 「CROI · R2」01-string
想贪心糖丸了。。。
一定是先进行覆盖操作再进行翻转操作,且覆盖操作不会执行两次。
记 表示 是否执行 操作的最小答案。
记忆化即可。
253.尼伯龙根的思维题(subway)
因为 非常大,大于 ,则我一定可以构造出使得权值加上任意偶数的方案。
现在判断 有无奇数和偶数路径即可。
-
在什么条件下, 有长为 的路径?( 充分大)
- 当 充分大时有解当且仅当 ,其中 是 所在强连通分量的环长集合。
-
在什么条件下, 有长为 的路径?( 充分大)
- 在模 意义下,若 存在长为 的路径,则 存在长为 的路径。
- 在模 意义下,任意一条 的路径长度均相等。
- 在模 意义下, 的路径长度为 。
- 当 充分大时有解当且仅当 ,其中 是 任一条路径的长度,其余定义如上。
-
充分大的条件是?
-
-
如何求出 ?
254.公司(company)
待补。
警告:不要跟自己的半暴力程序拍!
263.交换余生(change)
可以分治,预处理左右区间第 大和第 大,发现能合并的条件就是有区间交。
然后就是做个区间取 ,最后再区间求 ,发现区间左右端点单增,做两个单调栈即可,常数巨大,时间复杂度 。
正解是,考虑枚举区间第 大的取值,将 的设为 , 的设为 ,那么一个区间包含连续 个 ,那么 一定在他的第 大和第 大之间。
从大到小添加数,每连续 个 会有贡献,若增量维护,只有 个区间的贡献改变,时间复杂度 。
264.水管工(tank)
太神了这题。
发现若记录每个点是否连向四个方向,那么高级水管的放置需要满足左右不相等,上下不相等,这样总有一个方向可以满足,发现行列是不会影响的,这些限制可以分开做。
考虑没有 o
和 x
的情况,对于一个行,有 0????0
,那么中间所有填上高级水管是合法的,如果是 0????1
,那么中间可以做到至多一个低级水管,其他都是高级水管,条件等价于一个区间需要选择一个位置填低级水管,称为二类限制。
发现如果二类限制的行列有交,在交的位置填一个低级水管,可以同时满足两个限制,显然更优。
将有交的二类限制行列连边,问题等价于求最大匹配。
考虑有 o
的情况,那么二类限制的条件变为一个区间需要选择一个不为 o
的位置填低级水管。
再考虑有 x
的情况,发现另一个人可以选择任意水管(包括高级水管,但不计入答案)填入,那么这相当于一种四个方向都可以任意填 的方格,记为 2
,在处理到区间边界包含 2
时,就没有限制了。
复杂度是网络流的复杂度。
265.zkw线段树
for(m = 1; m < n + 2; m <<= 1, dep++);
F(i, 0, m + n + 1) tr[i].sum = tr[i].len = tr[i].tg2 = 0, tr[i].tg1 = 1;
F(i, 1, n) tr[m + i].sum = a[i], tr[m + i].len = 1;
dF(i, (m + n) >> 1, 1) up(i);
void upd1(int l, int r, int v) {
l = m + l - 1, r = m + r + 1;
dF(i, dep, 1) pd(l >> i), pd(r >> i);
while(l ^ r ^ 1) { // 互为兄弟节点
if(~l & 1) ptg_mul(l ^ 1, v);
if(r & 1) ptg_mul(r ^ 1, v);
l >>= 1, r >>= 1;
up(l), up(r);
}
for(l >>= 1; l; l >>= 1) up(l);
}
266.最短路(dis)
很妙的题,考虑所有最短路 的情况。
如果有 那么一定有一条路径 可以达到最短路,于是 这条边就不是必要的了,于是 只需要 就好了。
如果有 的话就会失效,因为这是条重边,会出现互相支配的情况。
考虑将 的缩起来,算上内部方案数,这样任意两个联通块变成了之间有若干条相等的重边,变为最短路 的情况,对重边随便计算一下即可。
条件三就容斥一下。
考虑内部方案数,相当于一个完全图,边在 ,要求 边联通所有点,设 为满足条件的图, 为不满足条件的图,有:
算一下就好了,时间复杂度 。
267.火烧云(qwq)
发现结论:任意时刻最多有 个连续段。
很好理解的,还有一种理性的方法:
- 考虑设 为长度 的连续段个数,我们可以证明 ,最优情况下肯定长度越小越好,而钦定了长度比较小的个数,于是连续段始终只有 段。
- 后面再补。
考虑时刻连续段个数都只有 段,于是时刻没火变成有火的点总共只有 段,所以有火变成没火的点总共只有 段。
于是只需要支持:
q\sqrtn 次单点激活
q\sqrtn 次单点取消激活,并赋值为0
q 次区间对激活的点求和
q 次区间对激活的点进行加法
分块维护即可。
268.童话镇(lab)
如果确定了起点和终点,等价于 dag
上最多不相交路径条数。
网络流可以做,但是考虑 LGV
引理。
计数转判定,随机选取边权,计算路径权值和,得到矩阵 ,则有解的条件是 ,其实等价于 是满秩的。
但是这题终点集合是不确定的,但是总的终点集合是确定的。
则 的极大组大小为 等价于 的秩为 。
那么 的极大组大小就是 的秩。
考虑扫描线,维护时间戳广义线性基(类似于矩阵乘法),每一行维护一个向量。
最后根据线性基中元素的时间戳就能确定右端点为 的区间的 段区间的秩的取值了。
269.2024牛客暑期多校训练营5
G
有结论:,其中 是所有实链的链顶,其中定义 为虚边的 是链顶,其中 也是。
发现条件等价于对于点 , 的实子树的最晚点要先于所以虚子树的最短点,其实就是实子树的最晚点是子树内的最晚点。
考虑 dp
,设 表示 子树内的答案,则有:
第二条,考虑一条重链互相抵消了。
其实也可以发现实链上最下面的点就是最晚点,除了最下面的点链上的其他店顺序任意,则条件也等价于只要实链之间有类似树的拓扑序关系,将实链缩成一个点,也是这个结论。
然后维护实链剖分即可,进行树剖,在每条重链上维护虚链集合,每次找到进行更改,更改次数是 的,每次 ,所以是两个 的。
证明考虑 lct
的实链剖分 access
的证明:
记 为当前重虚边个数。
-
如果当前修改的是轻虚边,那么不超过 条,然后至多会使 。
-
如果当前修改的是重虚边,那么会使 。
根据势能分析,可以证明。
所以直接维护就是对的。
270.2024“钉耙编程”中国大学生算法设计超级联赛(8)
A
271.概率生成函数学习
272.数据结构专题(xtq 和某些杂题)
273.花花的凸优化技巧和某些杂题
274.广义串并联图
非常启发。
275.TB5分治
276.QOJ4513 Slide Parade
考虑找到一条路径,正着走然后反着走就是环了。
考虑有解的情况,每个点的度数都是 ,将路径取出,就是有重边的
正则二分图,一定存在完美匹配,并且可以拆成 个完美匹配,说明欧拉路径的构造一定可以。
也就是说如果没有完美匹配就无解,于是问题可以说是每个点流量为某个 ,跑个匹配,使得每条边都选择至少一次。
可以跑个流,流量越大越好,每条边第一次选代价很大,后面选代价小,很大概率是能跑出解的。
引理: 正则二分图包含每条边的完美匹配都存在,可以用 hall
证明。
求出包含每个边的完美匹配即可做到 的构造。
考虑在残量网络上构造,对于非匹配边,在生成树上找一条路径进行增广即可完成替换,时间复杂度 。
也可以匈牙利玄学换边。
的正则二分图匹配:
其实直接按照一般图最大匹配进行随机化就行了。
277.QOJ5017 相等树链
对第一棵树进行点分治,设点分治的根是 。
将第一棵树上的链分为 ,找到两条链在第二棵树上的两个链头(一定得是条链)。
然后进行异或哈希,根据第二棵树上的链的实际两个链头(一定在 个链头之中)所在的集合( 还是 ),得出判断条件。
然后去掉不合法的情况。
还有一种哈希方法,得到第一棵树链上的点集合去掉 得到 ,将链上点在第二棵树上的父亲得到的点集合去掉 得到 ,则 。
另外还需附加条件,就是 的点个数等于 去除的点个数,且 。
巨大细节题。
278.CF2003
D2
每个序列有用的只有第一个和第二个 ,记为 。
前者向后者连边,形成 DAG
,如果某个点出度为 ,只有初始值为它时才能用后面的值,如果出度 ,后面的值始终可用,很好做了。
E2
考虑枚举前半序列的 和后半序列的 的分界点,转化成 01
序列,合法就得要求每个区间至少存在一个 0
和一个 1
,且是 00001111
排布。
显然 和 都从大到小排布最优,逆序对数就是 。
考虑对 01
序列进行 dp
,记 为考虑 ,有 个 。
如果 是区间的左端点,就枚举区间内部 个数,转移到右端点。
否则正常转移即可。
如果区间有交,找到并集的连通块,每个块求交集,删去除了交集以外的区间(并钦定这些区间必须是 ),然后区间就不交了。
F
考虑随机染色,正常 dp
,记 表示考虑 的数,使用了集合 的颜色,上一个数是 。
279.P4482 [BJWC2018] Border 的四种求法 / UOJ752Border 的第五种求法
border
理论的持续学习。
Weak Periodicity Lemma:若 和 是 的周期,且 ,则 也是 的周期。
Periodicity Lemma:若 和 是 的周期,且 ,则 也是 的周期。
border
的 border
是 border
。
引理:字符串 满足 ,则 在 中的所有匹配位置组成等差序列,公差为 的最小周期。
证明:考虑匹配次数 的情况, 说明两次匹配位置必定有交,而两次位置之差必定为 的一个周期。
考虑第一次第二次和最后一次匹配,根据 Weak Periodicity Lemma,两个差的 为 的周期。
不会,、、下次再写吧。
考虑 dag
链剖分,记 分别表示以 开头和以 结尾的路径个数。
对于 ,满足 是 的绝对重后继以及 是 的绝对重前驱,则为实边。
将 dag
剖分为若干条链,满足每条路径经过的链数是 的。
对于定位 ,在一条重链上,找到链底的一个位置,跳到当前点的一个位置,与已匹配位置求个最长公共前缀就能知道链上下一个位置了。
border
就可以转化为 parent
树上一条根往下的路径与 dag
上一条路径的交了。
拆成 个连续区间,在 parent
树上 dfs
,就很容易计算了。
280.基本子串结构(没学完)
记 为子串 的最长扩展串满足 ,存在且唯一。
将 相等的串视为一个等价类,满足 的串视为该等价类的代表院,每个等价类形成一个阶梯形。
以 为横坐标, 为纵坐标。
281.CF2007/CF2006
C
显然到无穷大的时候,这些数都可以在 意义下。
答案就是排序后相邻差的最小值。
D
显然合法只跟根节点和叶子节点有关。
对于叶子节点,一个人获得 ,另一个人获得 。
如果根节点已经填了,两个人的最优策略显然是不断填上叶子节点。
否则,如果 和 个数不同,先手可以选择填上根节点,获得 。
否则,如果先手填上根节点,他可以获得 。
如果他不选择填上根节点,他可以在非根非叶子节点处消耗步数,此时后手一定不会填根,也不会填叶子,只能跟着先手消耗步数,如果总步数是奇数的话,后手只能选择填上根,可以获得 。
E
当一个联通块的点按照 dfs
序排序成环后,两两相邻 一定刚好经过联通块内每条边两次。
每条边是被进去和出来时各经过一次。
对于一条路径,上面有些已经确定的边,如果还有没有确定的边,可以将剩下的边权和全部填上,简单维护即可。
F
观察到如果只有两个数,当差为 是合法。
将差提出,结束条件显然是,所有差为奇数且差相等。
当差为 时合法。
考虑三个数,差为 , 且 都是奇数。
拆成三个数 。
惊奇地发现 。
于是最后所有的差都为 除去 的因子,有单调性。
G
如果只有排序的话,就是第 小的搭上第 大的最优。
hot!!
拆成若干条件,,表示不能与 填在一起的数不能大于 的数。
对每个限制跑一遍即可。
H
显然需要每个点度数 ,根的度数 。
如果以某个点作为根的话,深度就是根到所有点的最远距离。
要让这个最小。
考虑线段树维护每个点作为根的最远距离。
同时维护直径,以及直径中点。
加上一个叶子,会使直径中点移动,对【每个点作为根的最远距离】的影响是直径中点某个方向的子树全体加一。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18337383
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-08-01 CF1051G Distinctification
2022-08-01 AGC020E Encoding Subsets
2022-08-01 Let's Play Nim
2022-08-01 CF1149C Tree Generator™