2022.1.4 营业日志

感觉阳了之后没完全好啊,非常想睡觉

以后这个东西把三天放在一起吧,感觉每天都更有点多的(

P3488 [POI2009]LYZ-Ice Skates

Description

给一张二分图,其中左边第 \(i\) 个点和右边 \([i,i+d]\) 有边,有数组 \(a_i\),构造一张网络,使得 \(S\) 到左部所有点有流量为 \(a_i\) 的边,右部所有点到 \(T\) 有流量为 \(k\) 的边。\(q\) 次修改,每次修改一个 \(a_i\),求修改之后能否满流。

Analysis

直接流可以 \(\mathcal{O}(qn^2)\),使用退流可能会快一点。

考虑用 Hall 定理,现在问题就是最小化 \(|N(S)|-|S|\)。考虑 DP,设 \(f_i\) 表示最后一个选 \(i\) 的答案,每次枚举下一个数,容易求出 \(|N(S)|\) 的变化。使用一些技巧不难优化到 \(\mathcal{O}(qn)\)

观察一下 \(|N(S)|\) 的形态,发现它构成若干段区间,如果它们满足任意一个都 \(\geq 0\),它们的并一定满足条件。所以只需要考虑 \(|N(S)|\) 为单个连续区间的情况,假设是 \([l,r]\),那么 \(S\)\([l,r-d]\) 一定是最优的。问题就变成了选择区间 \([l,r]\),最小化 \((r-l+1+d)k-\sum\limits_{i=l}^r a_i\),容易转化成最小子段和问题,用线段树维护即可。

CF765F Souvenirs

Description

给定序列 \(a_i\)\(q\) 次询问 \([l,r]\),求 \(\min\limits_{i,j\in[l,r],i\neq j}|a_i-a_j|\)

Analysis

之前听过这题,知道大致思路。

直接暴力枚举可以 \(\mathcal{O}(n^2)\)

最优化问题的一个思路是:删去一些无用的点对来降低复杂度。考虑哪些点是无用的。发现对于单个点 \(x\),假如它连了一个 \(y\),不妨设 \(a_y>a_x\),那么下个位置 \(a_z\) 满足 \((x,z)\) 有用等价于 \(a_z-a_x<a_y-a_z\),移项就是 \(a_z<(a_x+a_y)/x\),所以对于单个位置最多 \(\mathcal{O}(\log V)\) 个有用的值。把这些值提出来做二维数点即可。

还有一点是求出一个位置前面的最大的值域在 \([l,r]\) 内的位置没必要二分,直接动态开点线段树上维护就行。

启示:最优化问题可以只保留有用的对象,删除无用的对象。

P5333 [JSOI2019]神经网络

Description

给定 \(m\) 棵树,构造一张图,保留所有的树边,并在不同树的任意两个结点之间连一条边,求哈密顿回路数。

Analysis

做了两个晚上误打误撞得到了正解/yun,不过感觉正解并不复杂,出发点对了就好做很多。

暴力就是直接把所有边拿出来搜索,可以拿到 \(10\) 分。

因为计数哈密顿回路和计数排列差不多,而计数排列的经典方法是每次往排列中插入一个点,所以考虑 DP。发现我们并不能时时刻刻保证我们当前的排列合法,因为有的时候相邻两个点是没有边的,所以考虑设 \(f_{i,j}\) 表示插入前 \(i\) 个点之后,有 \(j\) 个相邻点之间没有边。对于一棵树,套路地考虑由叶子向根的 DP 顺序。分类讨论加入一个点之后 \(j\) 的变化。首先,如果插入位置两个点之间没有边,那么 \(j\) 固定 \(-1\),然后我们先将 \(j\)\(2\),如果前面一个点是相邻点,那么 \(j\)\(1\),后面是一样的。发现这样做的话,当前的方案数需要考虑相邻的点对的情况,点对至少包含几种信息:是否有边,是 \(i\) 的相邻点的个数。这样状态数会非常多,而且考虑到还会有归并两棵子树的排列这类极为麻烦的事情,所以基本上做不了。但是有的人因为最近做了分类讨论题以为这能讨论出什么

实际上 DP 还有另外的顺序,比如按 dfs 序 DP,这样做的好处在于每次环中只会有一个点和当前点相邻。然而问题在于我们还需要记录和某个点父亲相连的点和它父亲之间实际是否有边,这不能在状态中表示也不能后续钦定,所以这样也做不了。

上述瞎扯浪费了我至少 1.5h。

直接 DP 基本不行,考虑另外的想法。DP 的过程中实际上涉及了一个问题:如何求出 \(f_j\) 表示一棵树中构成的环里恰好有 \(j\) 个相邻点没有边的环数量。计数没有边是困难的,考虑从有边的点下手,这样问题转化为求 \(f_j\) 表示恰好 \(j\) 个相邻点之间有边的情况。容易想到在原树上找到这些相邻点的边,先构造出若干条这样的链,然后再构造出环。但是这样实际上是不准确的,我们得到的实际上是钦定的方案数,考虑反演转成恰好。这样只需要在树上做一个 DP 就好了,DP 是容易的,只需要考虑每个点的入边和出边。

然后问题就是把一些环合并起来,合并的过程中可能仍然保留了一些同一棵树中的没有边的点,继续考虑反演,钦定两个没有边的点捆在一起,这样做的唯一影响是减小了环的点数。最后的问题在于求出归并两个环之后要乘上的系数,我的做法是先把环展开成排列,归并排列,然后回到环,这样归并大小为 \(x,y\) 的环的系数就是 \(xy\dbinom{x+y}{x}\dfrac{1}{x+y}\)。总复杂度 \(\mathcal{O}(n^2)\)

思维链大概就是先构造每棵树,考虑每棵树有一些没有边的点,这些点必须要被全部分开,不妨容斥考虑不分开的点。然后问题转变成了一棵树上的问题,恰好 \(k\) 个没有边怎么求,做补集转化之后想到钦定一些边,然后再做一遍反演。

Solution

题解区的主流做法好像是先确定在同一棵树的边,然后把形成的链归并成环,但是由于同一棵树中的两条链不能相邻,所以容斥一下。

这个做法依据对路径形态的观察,路径肯定由若干树上的链和换树的边拼接得到,整个哈密顿路实际上是可以被拆解成若干条一棵树上的链的,所以考虑把对象划分成子对象然后再拼起来,拼接有条件所以容斥。我的做法就是直接对条件上了。感觉观察问题结构,不断拆分问题,最后得到一个可以直接 DP 构造的结构比较实在。

upd:越看越觉得这个做法阴间……

posted @ 2023-01-04 21:21  yllcm  阅读(44)  评论(0)    收藏  举报