2023 年 7 月训练记录

zhaohaikun / 2023-07-21 / 原文

训练

7 月没有做题题题题题题题题题。

MdOI R5 Many Minimizations

原问题有个经典做法,首先考虑暴力 DP,\(f_{i,j}\) 表示第 \(i\) 个数 \(=j\) 的最小代价,不难发现 DP 值是个分段函数,然后考虑用堆来维护。

\(mn_i=\min_{j}\{f_{i,j}\}\),每次操作相当于是往堆中先加入两个 \(a_i\),然后弹出最大值 \(mx\),可以发现 \(mn_i=mn_{i-1}+mx-a_i\)

于是,我们发现当 \(a_i<mx\) 时才会有贡献。计算答案时,我们对每个 \(a_i\le t< mx\) 分开计算,不难发现,\(t\) 的个数 \(= mx-a_i\)

我们把 \(a_i< x\) 的设为 \(0\),将 \(a_i\ge x\) 的设为 \(1\),则就相当于是一个函数 \(g_i\) 表示堆内 \(1\) 的个数。

  1. \(0\) 加入时:

    1. \(g_{i-1}>0\),则答案增加 \(1\)
    2. \(g_{i-1}=0\),则答案不变。
      换而言之,\(g_{i}=\max(0,g_{i-1}-1)\).
  2. \(1\) 加入时:
    \(g_{i}=g_{i-1}+1\)

我们发现对 \(0\)\(\max\) 的操作,是我们比较难处理的。

我们把 \((i,g_i)\) 看成一个点。我们考虑将对 \(0\)\(\max\) 的位置都先整体向上平移,并要求平移后的路径至少有一个点在 \(x\) 轴上,这个限制我们可以通过 \(y\) 坐标全部 \(\ge 0\) 的方案数减去 \(y\) 坐标全部 \(\ge 1\) 的方案数来处理,计算后面的东西可以使用反射容斥来算。

对于 \((0,a)\) 出发,到 \((n,b)\) 结束的路径,我们考虑计算它对答案。首先,总的下降次数为 \(\frac{n+a-b}{2}\),而由于对 \(0\)\(\max\) 的位置不对答案产生贡献,所以贡献为 \(\frac{n+a-b}{2}-a=\frac{n-a-b}{2}\)

时间复杂度 \(O(n^2)\)

记录。

AGC015E Mr.Aoki Incubator

我们先把点按坐标排序,一个点 \(i\) 被选中后,能染色在它右侧速度小于 \(\max\limits_{j=1}^{i} v_j\) 的点,以及在它左侧速度小于 \(\max\limits_{j=i}^{n} v_j\) 的点。

所以,越左的点对其左侧影响能力越强;越右的点对其右侧影响能力越强。于是,我们考虑 DP,\(f_i\) 表示 \(i\) 被选中,且 \([1,i]\) 已经全部被染色。因为越左的点对其左侧影响能力越强,如果前 \(i\) 个确定了,并且第 \(i\) 个被选中了,还有点没被染色,则说明右侧再怎么选也不可能让左侧的点被染色。

对于 \(f_i\),可行的转移 \(j\) 是一段连续的区间,因为要求 \(j\)\(i\) 染色能覆盖内部的所有点,所以 \(j\) 越大,对其右侧影响能力越强,且区间更小,所以更优。

考虑使用双指针来维护最左的可行转移 \(j\),并用前缀和求出答案。

时间复杂度 \(O(n\log n)\),瓶颈在于排序。

记录。

P2762 太空飞行计划问题

最大权闭合子图的板子。

我们让 \(S\) 向所有点权为正的点连边,流量为点权,让所有点权为负的点向 \(T\) 连边,流量为 \(-\) 点权,原图上的边流量为 \(\infty\)

正确性:答案为所有正点权和 \(-\) 最小割。首先,最小割不会割原图的边,割 \(S\) 到正点权点的边相当于不选这个点,割负点权的点到 \(T\) 的边,相当于选了一些正点权的点并由于原题的限制一定要选这个点,导致选了这个点。

构造方案就是 \(S\) 能到的点。

记录。

[TJOI2015] 弦论

由于对 SAM 的不熟悉(主要还是因为 \(10\) 级就开摆了),再加上我构造法没学明白,导致我一直不会后缀树,然后模拟赛考了。

不过强大 Qiuly、ybw051114 告诉我 SA 也可以建后缀树,于是就来学了下。

source。

我们先对原串进行后缀排序,然后求出 \(height\)。我们现在处理区间 \([l,r]\),找到区间中 \(height\) 最小的位置,将区间分裂,一直递归下去即可得到一棵后缀树。

板子:

int build(int fa, int l, int r) {
	int num = ++tot;
	::l[num] = l, ::r[num] = r;
	L[num] = R[fa] + 1;
	if (l == r) {
		pos[l] = num;
		R[num] = n - sa[l] + 1;
		return num;
	}
	int pos = qry(l + 1, r);
	R[num] = height[pos];
	ls[num] = build(num, l, pos - 1), rs[num] = build(num, pos, r);
	return num;
}

感觉这比构造法好理解太多了!!!

有了后缀树做这题就很简单了。

对于 \(t=0\) 的问题:我们先后缀排序,然后从前往后每个后缀的 \([height_i+1,len_i]\) 的前缀就是按照字典序排好的所有本质不同子串。

对于 \(t=1\) 的问题:我们按照上面的方法把后缀树建出来,然后我们在后缀树上遍历一下就可以求出答案了。

CF1221E Game With String

ZMF 和新疆张克姚 duel 的题。

注意到性质 \(a>b\),如果本来就存在或者能创造出长度为 \([b,a)\) 范围内的连续段,那 Bob 必胜。

然后就做完了。

首先,Alice 获胜要求不能出现长度为 \([b,a)\),并且不能出现超过 \(1\) 个长度 \(\ge 2b\) 的串。

若没有,则直接根据连续段个数决定胜负。

否则,Alice 第一次操作肯定是这个串。我们可以暴力枚举 Alice 的操作方式,如果 Alice 能改变串个数的奇偶性则必胜,否则依旧按照连续段个数决定胜负。

记录。

CF603E Pastoral Oddities

开始看错题了,以为要最小化边权和,直接自闭了。

首先,由于每个点的度数均为奇数,所以连通块大小一定全为偶数。进一步地,我们可以得出只有图中只存在大小为偶数的连通块,就一定能合法。

证明考虑构造。我们随便拉出连通块内的一棵生成树,然后从叶子往上选择断边来调整,因为总数数是对的,所以根一定合法。

于是,我们考虑线段树分治。首先,答案是单调不增的,所以,后面询问用的边前面一定会用。递归到叶子时,如果不满足条件,则把边权把比当前答案大的从小到大加入,直到满足条件为止。

时间复杂度 \(O(n\log^2n)\),线段树分治和并查集。不过可以用 LCT 做到在线 1log,不过我不会就是了。

记录。

CF238E Meeting Her

•́へ•́╬ 和 DitaMirika duel 的题,他们俩都没过。。 😅。。

注意到当前所在的点一定要求是线路最短路的必经点,但终点则可能是任意的,限制很松。

所以,我们考虑倒过来做。我们记 \(f_i\)\(i\) 到终点最少需要乘多少次。我们对每条线路跑一次 \(dij\),以这条终点为起点,求出到每个点所有最短路径中路径中经过最小点权最大值。这个满足不增性,所以可以用 \(dij\) 维护,然后对于这条线路上的必经点更新答案。

由于总共之后更新 \(O(n)\) 次,每次更新的复杂度是 \(O(kn\log n)\) 的,所以总复杂度为 \(O(n^2k\log n)\) 的,不过好像正解是 \(O(n^4)\)

记录。

CF1615H Reindeer Games

保序回归 \(L_1\) 问题的板子。

我们整体二分,先假设所有数取 \(mid\)\(mid+1\),求出答案,注意到这是个最大权闭合子图问题,用最小割解决。构造方案是找与 \(S\) 连通的部分。

根据论文中的结论,在所有数取 \(mid\)\(mid+1\) 问题中取 \(mid\) 的,值一定在 \([l,mid]\),否则值一定在 \([mid + 1, r]\)

时间复杂度 \(O(n^2m\log n)=O(能过)\)

记录。