8月记录

237.Hitori的字符串(string)

AC 自动机上随机游走问题,但是叶子 \(\le 100\) 个,有环。

考虑设元然后高斯消元,但对每个点设显然不优,考虑一种链剖分,对链顶设元。

然后按照 bfs 序(trie 树上的)维护每个点期望的表示(用元表示)。

1722513057963

如果 \(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\),维护值,将第一位滚掉。

这一部分是如下复杂度。
image

考虑用 \(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)\)

则:

\[S(n,j)=G(n)-\sum_{i=1}^{j-1}f(p[i])+\sum_{i=j}^{p[i]^2\leq n}\sum_{e=1}^{p[i]^{e+1}\leq n}\Big(f(p[i]^e)S(\lfloor\frac{n}{p[i]^e}\rfloor,i+1)+f(p[i]^{e+1})\Big) \]

左边是质数的贡献,右边是合数的,枚举合数的最小质因子还有次数,直接递归,不用记忆化。

image

241.士兵游戏(soldier)

考虑每条边的贡献,答案为 \(n\cdot \sum sz_i-\sum (sz_i)^2\)

对于 \(>\sqrt n\) 的质数 \(x\),子树大小为 \(\lfloor\frac{n}{x}\rfloor\),需要求区间质数个数,min25 即可。

对于 \(\le sqrt n\) 的质数 \(x\),有:

\[\sum_{x=1 \and x \in prime}^{\sqrt n} \sum_{y=1}^{\lfloor\frac{n}{x}\rfloor} [maxf(y)\le x]\sum_{z=1}^{\lfloor\frac{n}{xy}\rfloor} [minf(z)\ge x] \]

可以整除分块维护,中间两部分相当于特殊的 min25 其中一部分,可以做到 \(\mathcal O(\frac{n^{\frac{3}{4}}}{\ln n})\)

242.无理数乘法

image

这么 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. 整型与布尔型的转换

image

有启发性的题。

做一遍标记的复合。

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\) 答案为:

\[\frac{F_u^3(x)-3F_u(x^2)F_u(x)+2F_u(x^3)}{6} \]

前一项表示三条路径任选,中间项表示钦定两条相等,即算出至少一对相等的方案数,系数是 \(-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\) 时,答案多项式的值。

将他插回来就行了。

\[f(x)=\sum_{i=1}^{3w+1}y_i\prod_{j\ne i}\frac{x-x_j}{x_i-x_j} \]

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=\prod_{v\ne s_u} F_v\\ F_u=G_u F_{s_u}x+1 \]

\(G_u\) 可以考虑分治 NTT 维护乘积,轻子树大小总和是 \(\mathcal O(n\log n)\) 的,一个轻子树跟父亲合并,要分治 \(\log n\) 层,每层 \(\log n\) 的复杂度,所以是 \(\mathcal O(n\log^3n)\) 的。

对于 \(F_u\),考虑一条重链一起算。

\[F_1=G_1F_2x+1\\ =G_1(G_2F_3x+1)x+1\\ =G_1(G_2(G_3F_4x+1)x+1)x+1 \]

展开后发现只需要维护前缀乘积的和,依旧是分治 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\) 充分大的条件是?

    • image

    • image

  • 如何求出 \(g\)

    • image

254.公司(company)

待补。

image

警告:不要跟自己的半暴力程序拍!

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)

太神了这题。

发现若记录每个点是否连向四个方向,那么高级水管的放置需要满足左右不相等,上下不相等,这样总有一个方向可以满足,发现行列是不会影响的,这些限制可以分开做。

考虑没有 ox 的情况,对于一个行,有 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\) 为不满足条件的图,有:

\[f_n+g_n=(m+1)^{\frac{n(n-1)}{2}}=h_n\\ g_n=\sum_{j=1}^{n}f_jh_{n-j}m^{j(n-j)} \]

算一下就好了,时间复杂度 \(\mathcal O(n^3)\)

267.火烧云(qwq)

发现结论:任意时刻最多有 \(\mathcal O(\sqrt n)\) 个连续段。

image

很好理解的,还有一种理性的方法:

  • 考虑设 \(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\) 子树内的答案,则有:

\[f_u=\prod f_v\cdot \frac{(sz_u-2)!}{\prod (sz_v)!\cdot (sz_{hs}-1)!}(sz_u-1)\\ ans=n!\cdot \frac{sz_{hs}}{sz_u}\\ =\frac{n!}{\prod sz_v} \]

第二条,考虑一条重链互相抵消了。

其实也可以发现实链上最下面的点就是最晚点,除了最下面的点链上的其他店顺序任意,则条件也等价于只要实链之间有类似树的拓扑序关系,将实链缩成一个点,也是这个结论。

然后维护实链剖分即可,进行树剖,在每条重链上维护虚链集合,每次找到进行更改,更改次数是 \(\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\) 的正则二分图匹配:

image

其实直接按照一般图最大匹配进行随机化就行了。

277.QOJ5017 相等树链

对第一棵树进行点分治,设点分治的根是 \(rt\)

将第一棵树上的链分为 \((u,rt),(rt,v)\),找到两条链在第二棵树上的两个链头(一定得是条链)。

然后进行异或哈希,根据第二棵树上的链的实际两个链头(一定在 \(4\) 个链头之中)所在的集合(\((u,rt)\) 还是 \((v,rt)\)),得出判断条件。

然后去掉不合法的情况。

image

还有一种哈希方法,得到第一棵树链上的点集合去掉 \(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\) 的周期。

borderborderborder

引理:字符串 \(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\) 为纵坐标。

image

image

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\)

如果以某个点作为根的话,深度就是根到所有点的最远距离。

要让这个最小。

考虑线段树维护每个点作为根的最远距离。

同时维护直径,以及直径中点。

加上一个叶子,会使直径中点移动,对【每个点作为根的最远距离】的影响是直径中点某个方向的子树全体加一。

posted @ 2024-08-01 20:02  蒟蒻orz  阅读(46)  评论(0编辑  收藏  举报