8月记录
237.Hitori的字符串(string)
AC
自动机上随机游走问题,但是叶子 \(\le 100\) 个,有环。
考虑设元然后高斯消元,但对每个点设显然不优,考虑一种链剖分,对链顶设元。
然后按照 bfs
序(trie
树上的)维护每个点期望的表示(用元表示)。
如果 \(tr_{x,i}\) 是返祖边,显然深度比 \(x\) 小,一定被表示了。
否则一定是链顶,可以被表示。
或者将度数 \(>1\) 的点设为关键点也能做,没细想。
238.Hitori玩游戏(nim)
考虑随机化,将一种方案的权值记为线性基中自由元个数。
每次取出一个集合,删掉选的数,选一个新的数,如果权值减小了,就替换当前方案,如果相等,就以一定概率替换。
将集合元素按照 \(1\) 的个数多少排序,shuffle
一下选择集合顺序即可。
239.Hitori摘樱桃(cherry)
根据小凯的疑惑,只有两个数 \(x,y\),满足 \((x,y)=1\),那么 \(xy-x-y\) 是最大的不能被表示的数。
证明可以考虑同余最短路,在模 \(x\) 的意义下 \(i\to (i+y)\bmod x\),求出 \(f_i\) 表示 \(\bmod x =i\) 的最小能表示的数,将 \(f_i-x\) 取 \(\max\) 即可。
考虑这个图,就是一个环,可以手动模拟求出。
多个数也是一样的,求出所有数的 \(\gcd\),记 \(x=\gcd \cdot a,y=\gcd\cdot b\),那么 \((a,b)=1\),在 \(\gcd \cdot a \gcd \cdot b=xy\) 之后,所有数(\(\gcd\) 的倍数)都能被表示。
对于 \(\le V\) 的数暴力背包,\(>V\) 的数每个 \(\gcd\) 的倍数都能被表示,我们相当于要求 \((px+100-p)^n \bmod x^m\)。
倍增 NTT
即可维护,每次缩减长度。
注意,可以计算所有数到离他最近的 \(\gcd\) 的距离,即后面这一部分,然后在前面背包的部分在加上每个数离他最近的 \(\gcd\) 到离他最近的可以取到的数的距离。
240.Min-25筛
复习一下。
条件是质数位置和质数次方答案可以快速算。
先考虑求 \(G(m)=\sum\limits_{i=1}^{m}[i\in prime]f(i)\),其中 \(m\in\{\lfloor\frac{n}{1}\rfloor,\lfloor\frac{n}{2}\rfloor,...,\lfloor\frac{n}{n}\rfloor\}\)。
设 \(g(j,m)=\sum_{i=1}^m[i\in prime \; or \; minp(i)>p[j]]f'(i)\),其中 \(f'(i)\) 在质数处取值与 \(f\) 相同,然后是完全积性函数,可以快速求前缀和。
边界是 \(g(0,m)=\sum_{i=2}f'(i)\),如果质数取值是一个简单多项式,对每一项分别求即可。
-
若 \(p_j^2>m\),则 \(g(j,m)=g(j-1,m)\),因为没有最小质因子 \(>\sqrt m\) 的合数。
-
否则,下面式子表示减去最小质因子为 \(p_j\) 的数的函数和:
-
\[g(j,m)=g(j-1,m)-f'(p[j])\times \big(g(j-1,\lfloor\frac{m}{p[j]}\rfloor)-\sum_{i=1}^{j-1}f'(p[i])\big)\qquad (p[j]^2\leq m) \]
-
我们可以对每一个 \(m\),维护值,将第一位滚掉。
这一部分是如下复杂度。
考虑用 \(G(m)=\sum\limits_{i=1}^{m}[i\in prime]f(i)\) 求出所有 \(f\) 的和。
设 \(S(n,j)=\sum_{i=1}^n[minp(i)\geq p[j]]f(i)\),答案为 \(f(1)+S(n,1)\)。
则:
左边是质数的贡献,右边是合数的,枚举合数的最小质因子还有次数,直接递归,不用记忆化。
241.士兵游戏(soldier)
考虑每条边的贡献,答案为 \(n\cdot \sum sz_i-\sum (sz_i)^2\)。
对于 \(>\sqrt n\) 的质数 \(x\),子树大小为 \(\lfloor\frac{n}{x}\rfloor\),需要求区间质数个数,min25
即可。
对于 \(\le sqrt n\) 的质数 \(x\),有:
可以整除分块维护,中间两部分相当于特殊的 min25
其中一部分,可以做到 \(\mathcal O(\frac{n^{\frac{3}{4}}}{\ln n})\)。
242.无理数乘法
这么 nb
发现 \((1+\sqrt 3)^n+(1-\sqrt 3)^n\) 是整数,并且 \((1-\sqrt 3)^n\) 是一个在 \((-1,1)\) 且不为 \(0\) 的小数,所以求出 \(f(n)\),判断奇偶,就能知道 \(\lfloor(1+\sqrt 3)^n\rfloor\) 了,并且 \(a,b\) 可以递推,矩阵优化。
243.#D. 整型与布尔型的转换
有启发性的题。
做一遍标记的复合。
244.CF1982
E
记 \(f_{l,r,k}\) 表示区间 \([l,r]\) 的答案。
则答案最高位拆分,假设是 \(2^t\),则 \(f_{0,n-1,k}=f_{0,2^t-1,k)+f_{0,n-2^t-1,k-1}\)。
左端点都是 \(0\),可以预处理出 \(f_{0,2^t -1,k}\) 的所有取值,求任意 \(n\) 时单侧递归即可。
F
考虑找到极长合法前缀,左端点肯定在这里面,找到后缀的 \(\min\),找到前缀中最前的 \(>\min\) 的就是左端点了,后缀同理。
线段树上二分即可。
245.CF1993
有jb
D
挺好想的,二分中位数,dp
一下,记前缀取了 \(j\) 段,当前点是右端点的答案,发现前缀可能段数是 \(\mathcal O(1)\)。
E
考虑到扩展矩阵到第 \(n+1\) 行,第 \(m+1\) 列,操作就变成了交换第 \(i\) 行与第 \(n+1\) 行和交换第 \(j\) 列与第 \(n+1\) 列。
其实也等价于任意交换两行或两列。
发现找到行的排列和列的排列,每次操作相当于交换行排列任意两个数,列同理。
然后发现知道行排列和列排列就能知道原矩阵了,因为交换的顺序不会影响最后矩阵的排布,一定是 \(b_{r_i,l_j}\leftarrow a_{i,j}\)。
并且知道了行排列就能知道相邻行的差了,不管列排列是什么,列同理。
于是状压一下,记录当前选了哪些点,以及最后选的点是什么,后面加上一个点。
若我们枚举删除了哪个行,然后在剩下的行中计算列排列的贡献,删除列的情况可以在状态中体现,列同理。
时间复杂度 \(\mathcal O(n^32^n)\)。
F2
F1 就是先将矩形镜面对称一下,就变成循环矩阵了,将路径在循环矩阵上跑一跑,固定起点,可以快速计算 \((0,0)\) 有多少个点。
考虑 F2,可以将满足条件的点 \((x_j,y_j)\) 写成关于次数 \(i\) 和起点 \(x_n,y_n\) 的两个同余方程,解出关于 \(i\) 的通解来,合并一下即可。
Hitori的旅行(journey)
考虑用多项式描述背包,记 \(F_u(x)=\sum_{j=1}^{w} cnt_j x^j\)。
则点 \(u\) 答案为:
前一项表示三条路径任选,中间项表示钦定两条相等,即算出至少一对相等的方案数,系数是 \(-3\)。
然后至少两对相等的方案数是 \(+3F_u(x^3)\),最后至少三对相等的方案数是 \(-1F_u(x^3)\)。
只是从容斥的角度考虑,至少两对相等就等于至少三对相等,但是要合并系数。
然后现在题目变成了,逆拓扑序处理 \(F_u\),在每个点 \(u\) 做个卷积,将各项系数求和,做卷积的复杂度太高。
设 \(x=1\sim 3w+1\) 这几个值带入,卷积就是 \(\mathcal O(1)\) 的了,可以求出 \(x=1\sim 3w+1\) 时,答案多项式的值。
将他插回来就行了。
246.hdu 2024“钉耙编程”中国大学生算法设计超级联赛(6)
A. 造花(简单版)
删去的点度数一定是 \(2\),且合法的图中满足度数是 \(1\) 的点有很多,度数为 \(2\) 的点极少,对这些点判断即可。
B. 造花(困难版)
考虑一条边 \((u,v)\),存在 \(x\ne u\) 且 \(x,u\) 相连,且存在 \(y\ne v\) 且 \(v,y\) 相连(\(x\) 可以等于 \(y\)),则一定要在这里删一个。
否则就是三元环或者长度为 \(3\) 的链。
若没有,那么原图无环,且最长链 \(\le 2\),一定合法。
E. 交通管控
记 \(f_{i,j}\) 表示使用前 \(i\) 个操作,红绿灯的状态,容易转移。
G. 树上 MEX 问题
考虑计算 \(\operatorname{mex}\ge i\) 的方案数。
找到必须包含的关键点 \(j\in[1,i-1]\) 构成的虚树,如果 \(i\) 在虚树上,则 \(ans_i=ans_{i-1}\)。
否则,将 \(i\) 加入虚树(不断跳父亲),计算贡献,考虑 \(\operatorname{mex} \ge i\) 的联通块数量就是所有 \(v\),满足 \(v\) 与虚树有连边且 \(v\) 不在虚树上的 \((f_v+1)\) 的乘积,\(f_v\) 表示 \(v\) 子树包含 \(v\) 的联通块数量,容易预处理。
H. 树形 DNA
看作一个字符集为 \(2\) 的 trie
,可以将 \(T\) 分解为 \(\le 20\) 个字符串构成的 trie
,字符串集合为 \(Ts\)。
记 \(fa_{u,k}\) 表示 \(u\) 的 \(k\) 级祖先。
假设当前在 \(S\) 的 trie
上的节点 \(v\),若存在 \(s\in Ts\),满足 \(s\) 是 \(v\) 到根的字符串的后缀,则 \(cnt_{fa_{u,|S|}}\leftarrow cnt_{fa_{u,|S|}}+1\),若存在 \(cnt_u=k\),就是合法点,可以哈希。
I. 数字加减
可以看懂,根本无法写。
相当于每个时刻值域上有一些线段,每过一个时刻,线段往左右扩张 \(1\) 格,会合并,限制相当于删除。
颜色段均摊,每个线段维护中心点和半径可以简化。
J.Rikka 与子集 IV
类似题:[ABC269Ex] Antichain
合并是类似多项式卷积的形式,考虑描述,\(F_u=(\prod_v F_v)x+1\)。
每个多项式大小跟子树大小有关,考虑将重儿子和轻儿子分开计算。
则 \(G_u\) 可以考虑分治 NTT
维护乘积,轻子树大小总和是 \(\mathcal O(n\log n)\) 的,一个轻子树跟父亲合并,要分治 \(\log n\) 层,每层 \(\log n\) 的复杂度,所以是 \(\mathcal O(n\log^3n)\) 的。
对于 \(F_u\),考虑一条重链一起算。
展开后发现只需要维护前缀乘积的和,依旧是分治 ntt
,每个多项式依旧是轻子树大小。
这样能做类似题,但是这题需要求出重链上所有 \(F_u\) 的系数和。
考虑即为区间乘积的和,也可以分治 ntt
维护。
就做完了,时间复杂度 \(\mathcal O(n\log^3n)\)。
K. 天天爱跑步
给一棵基环树,对每个点 \(i\),求过 \(i\) 的最长简单路径。
数据范围:\(n\le 10^5\)。
容易口胡。
247.P10560 [ICPC2024 Xi'an I] Holes and Balls
类似题、弱化题:P4364 [九省联考 2018] IIIDX
考虑按位贪心,找到当前位最小能填的数,满足能填下,就填。
一个位置要填编号为 \(k\) 的球,有什么条件:
-
\(k\) 没被选;
-
\(k\) 大于父亲球的编号
-
编号 \([1,k-1]\) 的球能全部塞进 \(u\) 的子树外。
考虑条件二,相当于钦定 \(k\) 的下界,条件三就是钦定 \(k\) 的上界。
考虑找到上界,记 \(lim_j\) 表示 \(j\) 和 \(j\) 的祖先已填球的编号的最大值,\(sum_i=\sum_{j=1}^{n}[j\notin \operatorname{subtree}(u)] [lim_j\le i]\)。
贪心,考虑将 \(u\) 子树外的点按照 \((lim_j,dep_j)\) 排序,将 \([1,k-1]\) 填入,此时已经确定的点一定能填入自己的数。
若贪心过程不合法,一定存在一个 \(i\le k,sum_i<i\),则维护 \(sum_i\),二分找到满足 \(\forall i\le z, sum_i\ge i\) 的最大 \(z\) 就是上界了。
找答案就是在区间中找未被选的最大权值数,关于 \(sum\) 的修改,一个全未选子树的 \(lim\) 的相同的,容易维护。
维护两棵线段树做到 \(\mathcal O(n\log n)\)。
248.CF1989
E
用段数来映射 \(b\) 数组,\(q,q-1,q-2,\sim 1,1,2,3,\sim,x-1,x,x-1,\sim,1,1,2,\sim p\)。
然后开头结尾可以有长度为 \(2\) 的段,中间不行,会和两个 \(1\) 重复,dp
即可。
F
hot!
类似题:P5163 WD与地图
问题相当于每个时刻加一条有向边,求当前时刻强联通分量大小平方的和。
考虑分治维护,求出中间时刻的强联通分量,即 \(mid\) 时刻前的边,如条边两端点在同一个强联通分量内,将他插入左边子区间,其他边插入右边子区间,表示这些边不可能在 \([l,mid]\) 时两端点在同一个强联通分量内。
分治到了叶子,每个点存的边就是会改变强联通分量的边,用并查集维护联通块大小平方的和即可。
注意当前处理区间 \([l,r]\) 的边,需要将边的两端点改为联通块的关键点,即 \([1,l-1]\) 处理完后的联通块,因为每次要考虑联通块的合并,不是真实点的合并,不然复杂度就不对了。
249.P10766 「CROI · R2」01-string
想贪心糖丸了。。。
一定是先进行覆盖操作再进行翻转操作,且覆盖操作不会执行两次。
记 \(f_{u,i,j,k}\) 表示 \([u,n]\) 是否执行 \(1,2,3\) 操作的最小答案。
记忆化即可。
253.尼伯龙根的思维题(subway)
因为 \(k\) 非常大,大于 \(max(a_i,a_j)\times n\),则我一定可以构造出使得权值加上任意偶数的方案。
现在判断 \(1\to n\) 有无奇数和偶数路径即可。
-
在什么条件下,\(u\to u\) 有长为 \(k\) 的路径?(\(k\) 充分大)
- 当 \(k\) 充分大时有解当且仅当 \(\gcd\{len_i\}|k\),其中 \(\{len_i\}\) 是 \(u\) 所在强连通分量的环长集合。
-
在什么条件下,\(u\to v\) 有长为 \(k\) 的路径?(\(k\) 充分大)
- 在模 \(g\) 意义下,若 \(u\to v\) 存在长为 \(x\) 的路径,则 \(v\to u\) 存在长为 \(−x\) 的路径。
- 在模 \(g\) 意义下,任意一条 \(u\to v\) 的路径长度均相等。
- 在模 \(g\) 意义下,\(u\to v\) 的路径长度为 \(dep_v−dep_u\)。
- 当 \(k\) 充分大时有解当且仅当 \(g|k−dis(u,v)\),其中 \(dis(u,v)\) 是 \(u\to v\) 任一条路径的长度,其余定义如上。
-
\(k\) 充分大的条件是?
-
如何求出 \(g\)?
254.公司(company)
待补。
警告:不要跟自己的半暴力程序拍!
263.交换余生(change)
可以分治,预处理左右区间第 \(k\) 大和第 \(k+1\) 大,发现能合并的条件就是有区间交。
然后就是做个区间取 \(\max\),最后再区间求 \(\max\),发现区间左右端点单增,做两个单调栈即可,常数巨大,时间复杂度 \(\mathcal O(nk\log{\frac{n}{k}})\)。
正解是,考虑枚举区间第 \(k\) 大的取值,将 \(< v\) 的设为 \(0\),\(>v\) 的设为 \(1\),那么一个区间包含连续 \(k\) 个 \(1\),那么 \(v\) 一定在他的第 \(k\) 大和第 \(k+1\) 大之间。
从大到小添加数,每连续 \(k\) 个 \(1\) 会有贡献,若增量维护,只有 \(\mathcal O(k)\) 个区间的贡献改变,时间复杂度 \(\mathcal O(nk)\)。
264.水管工(tank)
太神了这题。
发现若记录每个点是否连向四个方向,那么高级水管的放置需要满足左右不相等,上下不相等,这样总有一个方向可以满足,发现行列是不会影响的,这些限制可以分开做。
考虑没有 o
和 x
的情况,对于一个行,有 0????0
,那么中间所有填上高级水管是合法的,如果是 0????1
,那么中间可以做到至多一个低级水管,其他都是高级水管,条件等价于一个区间需要选择一个位置填低级水管,称为二类限制。
发现如果二类限制的行列有交,在交的位置填一个低级水管,可以同时满足两个限制,显然更优。
将有交的二类限制行列连边,问题等价于求最大匹配。
考虑有 o
的情况,那么二类限制的条件变为一个区间需要选择一个不为 o
的位置填低级水管。
再考虑有 x
的情况,发现另一个人可以选择任意水管(包括高级水管,但不计入答案)填入,那么这相当于一种四个方向都可以任意填 \(0/1\) 的方格,记为 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)
很妙的题,考虑所有最短路 \(\ge 1\) 的情况。
如果有 \(w_{u,v}=w_{u,k}+w_{k,v}\) 那么一定有一条路径 \(u\to k\to v\) 可以达到最短路,于是 \((u,v)\) 这条边就不是必要的了,于是 \(g_{u,v}\) 只需要 \(\ge w_{u,v}\) 就好了。
如果有 \(w_{u,v}=0\) 的话就会失效,因为这是条重边,会出现互相支配的情况。
考虑将 \(w_{u,v}=0\) 的缩起来,算上内部方案数,这样任意两个联通块变成了之间有若干条相等的重边,变为最短路 \(\ge 1\) 的情况,对重边随便计算一下即可。
条件三就容斥一下。
考虑内部方案数,相当于一个完全图,边在 \([0,m]\),要求 \(0\) 边联通所有点,设 \(f_n\) 为满足条件的图,\(g_n\) 为不满足条件的图,有:
算一下就好了,时间复杂度 \(\mathcal O(n^3)\)。
267.火烧云(qwq)
发现结论:任意时刻最多有 \(\mathcal O(\sqrt n)\) 个连续段。
很好理解的,还有一种理性的方法:
- 考虑设 \(c_k\) 为长度 \(\le k\) 的连续段个数,我们可以证明 \(c_k\le k\),最优情况下肯定长度越小越好,而钦定了长度比较小的个数,于是连续段始终只有 \(\mathcal O(\sqrt n)\) 段。
- 后面再补。
考虑时刻连续段个数都只有 \(O(\sqrt n)\) 段,于是时刻没火变成有火的点总共只有 \(\mathcal O(q\sqrt n)\) 段,所以有火变成没火的点总共只有 \(\mathcal O(q\sqrt n)\) 段。
于是只需要支持:
q\sqrtn 次单点激活
q\sqrtn 次单点取消激活,并赋值为0
q 次区间对激活的点求和
q 次区间对激活的点进行加法
分块维护即可。
268.童话镇(lab)
如果确定了起点和终点,等价于 dag
上最多不相交路径条数。
网络流可以做,但是考虑 LGV
引理。
计数转判定,随机选取边权,计算路径权值和,得到矩阵 \(M\),则有解的条件是 \(\det M \ne 0\),其实等价于 \(M\) 是满秩的。
但是这题终点集合是不确定的,但是总的终点集合是确定的。
则 \([l,r]\) 的极大组大小为 \(i\) 等价于 \(M_{1\sim i,l\sim r}\) 的秩为 \(i\)。
那么 \([l,r]\) 的极大组大小就是 \(M_{1\sim k,l\sim r}\) 的秩。
考虑扫描线,维护时间戳广义线性基(类似于矩阵乘法),每一行维护一个向量。
最后根据线性基中元素的时间戳就能确定右端点为 \(r\) 的区间的 \(k\) 段区间的秩的取值了。
269.2024牛客暑期多校训练营5
G
有结论:\(ans=\frac{n!}{\prod sz_v}\),其中 \(v\) 是所有实链的链顶,其中定义 \((fa_u,u)\) 为虚边的 \(u\) 是链顶,其中 \(1\) 也是。
发现条件等价于对于点 \(u\),\(u\) 的实子树的最晚点要先于所以虚子树的最短点,其实就是实子树的最晚点是子树内的最晚点。
考虑 dp
,设 \(f_u\) 表示 \(u\) 子树内的答案,则有:
第二条,考虑一条重链互相抵消了。
其实也可以发现实链上最下面的点就是最晚点,除了最下面的点链上的其他店顺序任意,则条件也等价于只要实链之间有类似树的拓扑序关系,将实链缩成一个点,也是这个结论。
然后维护实链剖分即可,进行树剖,在每条重链上维护虚链集合,每次找到进行更改,更改次数是 \(\mathcal O(n\log n)\) 的,每次 \(\mathcal O(\log n)\),所以是两个 \(\log\) 的。
证明考虑 lct
的实链剖分 access
的证明:
记 \(W\) 为当前重虚边个数。
-
如果当前修改的是轻虚边,那么不超过 $\log $ 条,然后至多会使 \(W\leftarrow W+\log n\)。
-
如果当前修改的是重虚边,那么会使 \(W\leftarrow W-1\)。
根据势能分析,可以证明。
所以直接维护就是对的。
270.2024“钉耙编程”中国大学生算法设计超级联赛(8)
A
271.概率生成函数学习
272.数据结构专题(xtq 和某些杂题)
273.花花的凸优化技巧和某些杂题
274.广义串并联图
非常启发。
275.TB5分治
276.QOJ4513 Slide Parade
考虑找到一条路径,正着走然后反着走就是环了。
考虑有解的情况,每个点的度数都是 \(k\),将路径取出,就是有重边的 \(k\)
正则二分图,一定存在完美匹配,并且可以拆成 \(k\) 个完美匹配,说明欧拉路径的构造一定可以。
也就是说如果没有完美匹配就无解,于是问题可以说是每个点流量为某个 \(k\),跑个匹配,使得每条边都选择至少一次。
可以跑个流,流量越大越好,每条边第一次选代价很大,后面选代价小,很大概率是能跑出解的。
引理:\(k\) 正则二分图包含每条边的完美匹配都存在,可以用 hall
证明。
求出包含每个边的完美匹配即可做到 \(nm\) 的构造。
考虑在残量网络上构造,对于非匹配边,在生成树上找一条路径进行增广即可完成替换,时间复杂度 \(\mathcal O(nm)\)。
也可以匈牙利玄学换边。
\(nd\le 2\times 10^6\) 的正则二分图匹配:
其实直接按照一般图最大匹配进行随机化就行了。
277.QOJ5017 相等树链
对第一棵树进行点分治,设点分治的根是 \(rt\)。
将第一棵树上的链分为 \((u,rt),(rt,v)\),找到两条链在第二棵树上的两个链头(一定得是条链)。
然后进行异或哈希,根据第二棵树上的链的实际两个链头(一定在 \(4\) 个链头之中)所在的集合(\((u,rt)\) 还是 \((v,rt)\)),得出判断条件。
然后去掉不合法的情况。
还有一种哈希方法,得到第一棵树链上的点集合去掉 \(u',v',rt\) 得到 \(S1\),将链上点在第二棵树上的父亲得到的点集合去掉 \(fa_{rt},rt\) 得到 \(S2\),则 \(S1=S2\)。
另外还需附加条件,就是 \(fa_w=rt\) 的点个数等于 \(S1\) 去除的点个数,且 \(\le 2\)。
巨大细节题。
278.CF2003
D2
每个序列有用的只有第一个和第二个 \(mex\),记为 \((a_i,b_i)\)。
前者向后者连边,形成 DAG
,如果某个点出度为 \(1\),只有初始值为它时才能用后面的值,如果出度 \(>1\),后面的值始终可用,很好做了。
E2
考虑枚举前半序列的 \(\max\) 和后半序列的 \(\min\) 的分界点,转化成 01
序列,合法就得要求每个区间至少存在一个 0
和一个 1
,且是 00001111
排布。
显然 \(0\) 和 \(1\) 都从大到小排布最优,逆序对数就是 \(C(a0,2)+C(a1,2)+(10 对数)\)。
考虑对 01
序列进行 dp
,记 \(f_{i,j}\) 为考虑 \([1,i]\),有 \(j\) 个 \(1\)。
如果 \(i\) 是区间的左端点,就枚举区间内部 \(0\) 个数,转移到右端点。
否则正常转移即可。
如果区间有交,找到并集的连通块,每个块求交集,删去除了交集以外的区间(并钦定这些区间必须是 \(0/1\)),然后区间就不交了。
F
考虑随机染色,正常 dp
,记 \(f_{i,s,j}\) 表示考虑 \([1,i]\) 的数,使用了集合 \(s\) 的颜色,上一个数是 \(j\)。
279.P4482 [BJWC2018] Border 的四种求法 / UOJ752Border 的第五种求法
border
理论的持续学习。
Weak Periodicity Lemma:若 \(p\) 和 \(q\) 是 \(s\) 的周期,且 \(p+q \le |s|\),则 \(\gcd(p,q)\) 也是 \(s\) 的周期。
Periodicity Lemma:若 \(p\) 和 \(q\) 是 \(s\) 的周期,且 \(p+q-\gcd(p,q) \le |s|\),则 \(\gcd(p,q)\) 也是 \(s\) 的周期。
border
的 border
是 border
。
引理:字符串 \(u,v\) 满足 \(2|u|\ge |v|\),则 \(u\) 在 \(v\) 中的所有匹配位置组成等差序列,公差为 \(u\) 的最小周期。
证明:考虑匹配次数 \(>2\) 的情况,\(2|u|\ge |v|\) 说明两次匹配位置必定有交,而两次位置之差必定为 \(u\) 的一个周期。
考虑第一次第二次和最后一次匹配,根据 Weak Periodicity Lemma,两个差的 \(\gcd\) 为 \(u\) 的周期。
不会,、、下次再写吧。
考虑 dag
链剖分,记 \(f_u,g_u\) 分别表示以 \(u\) 开头和以 \(u\) 结尾的路径个数。
对于 \(u\to v\),满足 \(v\) 是 \(u\) 的绝对重后继以及 \(u\) 是 \(v\) 的绝对重前驱,则为实边。
将 dag
剖分为若干条链,满足每条路径经过的链数是 \(\log\) 的。
对于定位 \(s[l,r]\),在一条重链上,找到链底的一个位置,跳到当前点的一个位置,与已匹配位置求个最长公共前缀就能知道链上下一个位置了。
border
就可以转化为 parent
树上一条根往下的路径与 dag
上一条路径的交了。
拆成 \(\log\) 个连续区间,在 parent
树上 dfs
,就很容易计算了。
280.基本子串结构(没学完)
记 \(ext(t)\) 为子串 \(t\) 的最长扩展串满足 \(occ(ext(t))=occ(t)\),存在且唯一。
将 \(ext\) 相等的串视为一个等价类,满足 \(ext(t)=t\) 的串视为该等价类的代表院,每个等价类形成一个阶梯形。
以 \(l\) 为横坐标,\(r\) 为纵坐标。
281.CF2007/CF2006
C
显然到无穷大的时候,这些数都可以在 \(\bmod \gcd(a,b)\) 意义下。
答案就是排序后相邻差的最小值。
D
显然合法只跟根节点和叶子节点有关。
对于叶子节点,一个人获得 \(\lfloor\frac{lst}{2}\rfloor\),另一个人获得 \(\lceil\frac{lst}{2}\rceil\)。
如果根节点已经填了,两个人的最优策略显然是不断填上叶子节点。
否则,如果 \(0\) 和 \(1\) 个数不同,先手可以选择填上根节点,获得 \(\lfloor\frac{lst}{2}\rfloor\)。
否则,如果先手填上根节点,他可以获得 \(c+\lfloor\frac{lst}{2}\rfloor\)。
如果他不选择填上根节点,他可以在非根非叶子节点处消耗步数,此时后手一定不会填根,也不会填叶子,只能跟着先手消耗步数,如果总步数是奇数的话,后手只能选择填上根,可以获得 \(c+\lceil\frac{lst}{2}\rceil\)。
E
当一个联通块的点按照 dfs
序排序成环后,两两相邻 \(dis\) 一定刚好经过联通块内每条边两次。
每条边是被进去和出来时各经过一次。
对于一条路径,上面有些已经确定的边,如果还有没有确定的边,可以将剩下的边权和全部填上,简单维护即可。
F
观察到如果只有两个数,当差为 \(2^k\) 是合法。
将差提出,结束条件显然是,所有差为奇数且差相等。
当差为 \(1\) 时合法。
考虑三个数,差为 \(a,b\),\(a<b\) 且 \(a,b\) 都是奇数。
拆成三个数 \(a,\frac{a+b}{2}-a,\frac{a+b}{2}\)。
惊奇地发现 \(\gcd(a,\frac{a+b}{2}-a,\frac{a+b}{2})=\gcd(a,b)\)。
于是最后所有的差都为 \(\gcd\) 除去 \(2\) 的因子,有单调性。
G
如果只有排序的话,就是第 \(i\) 小的搭上第 \(i\) 大的最优。
hot!!
拆成若干条件,\(1\le i\le \sqrt k,cnt(1,i)\ge cnt(\lfloor\frac{k}{i+1}\rfloor, k)\),表示不能与 \(i+1\) 填在一起的数不能大于 \(\le i\) 的数。
对每个限制跑一遍即可。
H
显然需要每个点度数 \(\le 3\),根的度数 \(\le 2\)。
如果以某个点作为根的话,深度就是根到所有点的最远距离。
要让这个最小。
考虑线段树维护每个点作为根的最远距离。
同时维护直径,以及直径中点。
加上一个叶子,会使直径中点移动,对【每个点作为根的最远距离】的影响是直径中点某个方向的子树全体加一。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18337383