12 月记录

529.CF2034F2

强化为 \(m\) 倍。

首先可以观察到,每条路径的概率相等,故我们只需计算所有路径的宝石和。

定义每次满足翻倍条件时,我们是将每个现有的宝石复制 \((m-1)\) 份。

设 \(f_{x,y}\) 表示在满足条件 \((x,y)\) 时,生成的宝石数。

每次满足状态时,我们要么由从箱子中抽取的宝石生成新宝石,要么由先前生成的宝石生成新宝石。

对于前者,转移为:

\[f_{x,y}\leftarrow P(0,0,x,y)\times (2x+y) \]

对于后者,转移为:

\[f_{x2,y2}\leftarrow f_{x1,y1}\times P(x1,y1,x2,y2)[x1\le x2][y1\le y2] \]

意义为由状态 \((x1,y1)\) 生成的宝石在当前生成新宝石。

时间复杂度 \(\mathcal O(k^2)\)。

530.CF2042F

似乎直接维护在区间中取了 \(1/2\) 个区间的最大值就好了,直接做模拟费用流的话非常麻烦。

\(a \oplus b+b\oplus c\ge a\oplus c\)。

image

531.CF2042E

手刃 clist *2800。

先二分找到一个必选的根,每次只需按位考虑能否去掉一个点,相当于将这个点及其子树都去掉。

那么如果子树内有一种颜色出现两次,显然不行,否则,需要子树内的点的另外一个对应点在根所在的联通块内,随便优化一下就好了。

532.The 3rd Universal Cup. Stage 19: Shenyang https://qoj.ac/contest/1865

A

妙妙题。

可以转化为递减序列,首项必须贡献高度,其他位置可以选择是否贡献高度。

设 \(dp1_{i,j,k}\) 表示考虑了 \(i\) 段,从大到小考虑到长度为 \(j\) 的段,目前高度是 \(k\),转移可以考虑新增一个长度为 \(j\) 的段,或者转而考虑长度为 \(j-1\) 的段,这样是一步一步走,似乎跳着走也可以,不过麻烦些。

设 \(dp2_{i,j,k}\) 表示考虑了 \(i\) 段,其中有 \(j\) 段对高度有贡献,目前高度为 \(k\),转移可以考虑新增一个长度为 \(1\) 的段,或者已有的段全部增高 \(1\),妙妙,发现每种状态都有唯一转移,类似杨表的转移。

考虑根号分治,在 \(dp2\) 中处理长度 \(\ge \sqrt m\) 的段,即转移修改成每次新增一个长度为 \(\sqrt m\) 的段。

然后用 \(dp2\) 更新 \(dp1\) 的初值,再使用 \(dp1\) 处理长度 \(< \sqrt m\) 的段即可。

时间复杂度 \(\mathcal O(nm\sqrt m)\)。

B

写个搜发现 \(\gcd(n,m)>1\) 无解。
image

C

非常妙的题。

无解的情况只有第 \(1\) 轮开始时就有角色被陨石砸到,或者某一轮中所有格子均有陨石落下。

考虑只有一个角色的情况,考虑时光倒流,第 \(m\) 轮是一个单点,找到前一轮的位置,加上走过的区间并多出来的部分的前缀时间的陨石和。

考虑一个区间 \([l,r]\),如果上一轮有格子没有落下陨石可以直接走到这些格子,否则一定是走到两侧最近的不会落下陨石的格子。

妙妙!可以归纳证明,所有有效的区间左右端点单调,且每一轮只有 \(\mathcal O(n)\) 个。

考虑有多个角色的情况,若某些角色在之后要相遇,可以直接调整为在第一轮相遇,不会变劣,太妙了。

于是先做上面的转移,求出 \(\mathcal O(n)\) 个有效区间的 dp 值。

接下来选择这些区间的若干个,每个区间内的角色不用考虑,只需算上区间外的角色向左或者向右走到一个区间,并沿途挖空第一轮落下的陨石。

设 \(dp_{i,0/1/2}\) 表示考虑到 \([1,i]\),当前格子没有区间外的角色经过 \(/\) 有区间外的角色向左经过 \(/\) 有区间外的角色向右经过时所需挖走的最少陨石总数。

std 的转移写得很妙,限制不用太紧,因为不满足限制的转移都是不优的,使用单调队列维护选择区间的转移的 \(\max\) 即可,注意 \(dp_{i,1}\) 需要钦定前面有选择区间,\(dp_{i,2}\) 就不需要,因为他贡献不了答案。

D

发现答案就是逆序对的奇偶性。

区间左右移动也可以看成若干次交换相邻,也很好处理。

E

考虑找到一个初始矩阵的顺序,每次计算前缀的影响,得到当前的矩阵,算上最短路径,得到一种方案的代价。

状压找最小代价即可。

H

遍历实际上是 dfs,每次找最小编号未访问点。

考虑一棵树,以 \(1\) 为根,从 \(u\) 点可以往子树中连出的边,对于树边 \(u\to v\),\(u\) 还可以与 \(v\) 子树内编号 \(>v\) 的点任意连边,方案数为 \(2^k\),容易发现只有这些方案。

可以不经过特殊边的情况用上面算就好了。

接下来考虑添加 \(p\to q\),连接了两棵树。

  • \(T1\) 连边无影响。
  • \(T2\) 连边是以 \(q\) 为根。
  • \(T1\) 与 \(T2\) 的连边相当于是 \(1\to p\) 路径上的点与 \(T2\) 上的点的贡献。

可以分别处理,第二部分就换根,第三部分搜一下就行了。

I

很妙。

限制就是后缀 \(k\) 层的边数和不超过 \(k\) 条。

从必要性考虑,找到最深的点子树中有两个叶子深度相同,那么一定要修改一条,并且不会修改两条,因为将其中一条换成 \(u\) 到父亲的边更优。

枚举修改两条边之中的一条然后递归处理,由于最多修改 \(n\) 条边,递归次数是 \(\mathcal O(2^n)\),每次找 \(u\) 的时间复杂度是 \(\mathcal O(n2^n)\),总时间复杂度是 \(\mathcal O(n4^n)\)。

J

模拟题。

L

image

现在就是找到 \(f(L)-f(R)\ge K\) 的 \(R-L\) 最小然后 \(L\) 最小的解。

注意到最优解一定可以平移使得 \(L,R\) “恰好”是某次过题的时间。

于是我们反向考虑,固定 \(L\) 是某次过题的时间,二分求出最小的过题时间 \(R'\) 使得 \(f(L)-f(R')\ge K\),再在 \(R'\) 和上一次过题时间之间二分得到最小的 \(R\),因为同一段内的 \(f\) 是单调的,再尝试向左平移这组解,固定 \(R\) 为某次过题的时间是同理的。

M

连出有向图,问题变成从某个点出发是否能到达一个权值和非 \(0\) 的环,考虑缩点。

问题变为判断一个强联通分量是否有权值和非 \(0\) 的环。

若一个强联通分量所有环权值和为 \(0\),可以一定满足取出一棵 dfs,求出 \(dep\),满足所有非树边的限制,就这样检查即可。

533.P9142 [THUPC 2023 初赛] 欺诈游戏

534.P9133 [THUPC 2023 初赛] 大富翁

535.P9135 [THUPC 2023 初赛] 快速 LCM 变换

536.P9137 [THUPC 2023 初赛] 速战速决

537.P10801 [CEOI2024] 海战

538.P9482 [NOI2023] 字符串

539.CF1750F

540.P10786 [NOI2024] 百万富翁

541.P11110 [ROI 2023 Day 2] 陶陶装苹果

542.P8476 「GLR-R3」惊蛰

543.[ABC347G] Grid Coloring 2

544.QOJ8089 Flaaffy

超级妙!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

545.QOJ9863 Brackets

显然只需考虑合法的串、内部合法且剩下若干左括号、内部合法且剩下若干右括号这三种情况。

其中后面两种哈希匹配即可,问题变成如何求剩下的括号的哈希值。

以左括号为例,维护一个栈,如果当前是右括号,且栈顶左括号无法与他匹配,则清空栈,并标记后续所有左端点小于它的区间无效;否则进行匹配。

如果是左括号直接加入即可。

考虑一个区间左端点,首先得是左括号,如果左端点在某对匹配的括号内部(这个在进行括号匹配时,做个区间覆盖即可,并查集维护),则区间不合法。

否则,计算栈中所有位于这段区间内的左括号的哈希值(二分),存下后缀哈希值即可。

时间复杂度 \(\mathcal O(n\log n)\)。

546.P7830 [CCO2021] Through Another Maze Darkly

妙妙题。

直接模拟感觉非常复杂。

还是应该紧密结合特殊性质。

发现进行有限次后,我们会按照欧拉序进行访问。

于是在欧拉序上模拟,如果我们某次从 \(u\) 走到 \(u\) 的父亲上了,意味着下一次走到 \((u,k)\) 的下一个节点必然是 \((u,k)\) 在欧拉序的下一位,这样的路径下一个点是有规律可循的,可以与欧拉序结合。

我们钦定这个欧拉序是环状的。

我们先标记所有节点,如果当前在一个有标记的节点,发现重要性质:这个节点一定没有被访问过,其实就是定义、、、我们删除 \(u\) 的所有标记(因为在此时,我们就已经可以将 \(u\) 解决了,后面的遍历顺序和欧拉序已经相同),并跳到 \(u\) 的顺时针第二个儿子处(注意是在欧拉序上)。

于是我们对于 \(x\),删除他的所有标记,跳到第二个儿子处,然后顺序走到下一个有标记的位置,使用并查集维护即可。

询问可以离线下来做到 \(\mathcal O(n\alpha(n)+q)\)。

547.P11364 [NOIP2024] 树上查询

笛卡尔树做法:

二分求出一个点为 LCA 的极长区间,转化为链上问题。

问题变为有 \(\mathcal O(n)\) 个关键区间,查询与一个区间交 \(\ge k\) 的关键区间的权值最大值。

发现竟然可以扫描线!!!

分治做法:

一个区间的所有子区间可以变成 \(\mathcal O(\log n)\) 段线段树区间的所有子区间贡献加上 \(\mathcal O(\log n)\) 次跨越中点的贡献。

处理跨越区间的贡献,等价于每个点有权 \(a_i\),区间 \([l,r]\) 的权为 \(\min(a_l,a_r)\)。

找到极长关键区间,发现 \(a\) 是单调的,所以关键区间互相包含。

考虑前者,容易处理。

考虑后者,发现一个询问区间只会有一次 \(L\ne l,R\ne r\) 的情况,对于这次二分特殊处理即可。

然后以 \(L=l\) 为例,需要找到与 \([L,R]\) 交 \(\ge k\) 的关键区间最大值。

找到长度 \(\ge k\) 的最小关键区间,若能满足就是最优,否则根据关键区间互相包含,找到左端点 \(\le R-k+1\) 的最小关键区间,发现他一定满足交 \(\ge k\),由必要和充分可以证明这是最优解,就做完了。

upd:还要学习一下树上合并关键区间的做法,YER。

548.XX Open Cup. Stage 14. Grand Prix of Wroclaw

J

显然可以先修改再交换。

交换其实和花费 \(|i-j|\cdot w_s\) 交换 \((i,j)\) 等价,那么交换可以直接用起点终点的匹配表示,且每次交换必然是 \(01\) 交换。

于是,一个位置被修改了,就不会参与交换。

进一步,已经匹配的位置不会动了。

然后,显然交换操作不会相交。

再进一步,如果 \([i_1,j_1]\) 匹配,那么对于 \(i_1\le i<j\le j_1\),且 \(i,j\) 都被修改且不同,那么 \(i,j\) 也一定可以调整为匹配,且 \([i_1,j_1]\) 区间内必然都是交换。

设 \(f_i\) 表示 \([1,i]\) 匹配的最小代价,当前位置要么修改,要么与前面一个匹配。

修改容易处理,交换用栈找唯一合法位置即可。

还有模拟费用流做法。

带有反悔操作的堆,意义可以表示为获得一个物品需要走的反悔边的代价。


可以发现对于已经匹配的位置我们肯定不会去动它们,否则答案一定不够优。对于操作\(3\)其实等价于花\(|i-j| \cdot t_s\)的代价交换\(i\)和\(j\)。

考虑两个交换操作\((i_1,j_1)\)和\((i_2,j_2)\),显然区间\([i_1,j_1]\)和\([i_2,j_2]\)要么相离,要么其中一个被另一个包含。因为出现相交的话,我们总是可以调整一下,使答案不变劣。

进一步可以发现,如果\([i_1,j_1]\)用了交换操作,那么对于\(i_1 \le i < j \le j_1\)的\((i,j)\)我们都可以用交换操作。这是因为,一旦最优解里用了交换操作,则有\(|j_1-i_1| \cdot t_s \le t_0+t_1\),那么对于\(i_1 \le i < j \le j_1\)的\((i,j)\),也是有\(|i-j| \le t_0+t_1\)的。

因此我们可以考虑用dp来求最小代价。令\(dp(i)\)表示把前\(i\)个位置匹配的最小代价,那么有两种操作法:

  • 选择操作\(1\)或者\(2\),那么\(dp(i) \overset{\min}{\leftarrow} dp(i-1)+t_0 \text{ or } t_1\)
  • 选择操作\(3\),我们需要找到一个最大的\(j\),使得区间\([j,i]\)里都可以通过交换操作来搞定。然后\(dp(i) = \overset{\min}{\leftarrow} dp(j-1) + cost(j,i)\)。

这个最大的\(j\)我们可以用一个两个栈维护01和10匹配的情况,然后顺便也可以求出\(cost(j,i)\)。

D

I

很晕。

不相交路径,可以想到网络流,流量为 \(2\)。

但是直接跑会有负权边。

考虑先求出 \(1\) 到所有点最短路 \(h_u=dis_u\),修改边权 \(w(u,v)\) 为 \(w(u,v)+h_u-h_v\),于是,新图上 \(1\) 到 \(x\) 最短路加上 \(h_x\) 就是原图上的最短路了。

发现新图具有性质:\(1\) 到 \(x\) 最短路径上的边全是 \(0\)。

于是我们模拟流,将这些边翻转,每条边的权依旧非负,并且将势能 \(h_u\) 改为 \(h_u+dis_u\)。

再跑 \(1\to x\) 的最短路,加上 \(h_u=2dis_u\) 就是答案了。

image-20241210113707881

这样就对了,因为我们只需证明在翻转了边之后的新图上,应用每个点的新势能,边权非负。

于是先求出 \(dis_x\),翻转最短路上的边,再求 \(dis'_x\),加上 \(2dis_x\) 就是答案。

考虑按照 dij 一样松弛就是 \(dis'_x\),我们希望找到一个顺序,使得提出 \(dis'_x\) 时它就是最优的。

那么我们只需要将被松弛的点放进堆中,每次取出最小的就能满足,前提是我们可以松弛所有情况。

image-20241210150237699

首先考虑 \(1\) 号点,分成若干联通块,考虑 \(u\) 连接的非树边,直接松弛。

然后不同联通块的边,比如 \((a,b,w)\),发现可以用 \(f_a+w\) 更新 \(f_b\),而同一联通块的边松弛不了。

然后发现,\((a,b,w)\) 在松弛后就没有任何用了,可以删掉,\(1\) 号点也是。

在最短路树\(D\)上的边:可以发现从\(u\)其实可以到达树上任意的节点,并且花费的代价都是\(0\),因为树边的边权都是\(0\)了。考虑把点\(u\)删掉,那么\(u\)所在的连通块会分成若干个小连通块。对于横跨不同小连通块之间的边\(A \to B\),我们显然是可以用\(dist(u) + w(A,B)\)来更新\(dist(B)\)的。所以一个粗暴的做法就是枚举每个新出现的小连通块,以及里面每条横跨边,做一遍更新。但是这样复杂度是\(O(n^2)\)的。可以发现,如果不遍历最大的连通块,只遍历其他较小的连通块,这样复杂度是有保证的,每条边最多只会被遍历\(O(\log n)\)次。

然后扩展一下,每次取出一个最小点,松弛这些边,分裂成若干联通块,分治下去即可。

而枚举不同块之间的边代价太大,类似启发式分裂,我们不遍历最大的联通块,只遍历最小的联通块,这样每个点只会枚举 $\log $ 次,每条边也是。

感觉很妙,但是。

aJ9X1-ncZPf9PrS0e2isd

549.P9542 [湖北省选模拟 2023] 棋圣 / alphago

考虑一个环,如果是奇环,那么任意状态都是可达的,答案就是 \(c_0\times c_1\times \max w\),否则,奇偶性相同的任意节点都能聚在一起,答案为 \((c_{0,0}\times c_{1,1}+c_{0,1}\times c_{1,0})\times \max w\)。

发现有环的情况都能先将所有点聚在环上(如果环被占满了,那么任意操作都能搞出一个空位),如果有奇环,就是前者,否则就是后者,二分图染色判断即可。

接下来考虑树的情况。

发现,若存在度数 \(>2\) 的点,即存在 \(a,b,c,d\),且存在 \((a,b),(a,c),(a,d)\),操作 \(b\) 子树,能使得一对在 \(c,d\) 子树内的点距离减少,其他距离不变,并且一直能操作,于是奇偶性相同的点都能缩到一起了。

那么剩下一条链的情况,那么每次操作,要么将相邻两对点的距离 \(-2\),要么平移所有点,相对顺序不变。

考虑 dp,设 \(f_{i,l,r}\) 表示链上第 \(i\) 个点聚集了区间 \([l,r]\) 中的棋子,转移枚举下一段 \([r+1,r']\) 在第 \(j\) 个位置,满足限制 \(j-i\le x_{r+1}-x_r\),于是 \(i,j,r'\) 这三维是 \(\mathcal O(n^2)\) 级别的,总复杂度 \(\mathcal O(n^4)\)。

550.P9136 [THUPC 2023 初赛] 种苹果

新时代打磨你,随机撒 \(A\) 个点建虚树,任意点到最近关键点为 \(\mathcal O(\frac{n}{A})\),维护虚树中相邻关键点之间的链,每条链重构复杂度 \(\mathcal O(\frac{n}{A}\log n)\),插入为 \(\mathcal O(\frac{n}{A})\)。

查询,暴力 \(\mathcal O(\frac{n}{A})\) 跳散块,整块二分 \(\mathcal O(A\log n)\)。

修改,对于虚树下方节点需要暴力,散块也暴力,整块打标记,注意无需重构,因为我们维护的是排序数组,对其中一些点加定值后,归并即可,\(\mathcal O(\frac{n}{A}+A)\)。

令 \(A=\sqrt{\frac{n}{\log n}}\),时间复杂度 \(\mathcal O(m\sqrt{n\log n})\)。

加点考虑定期重构,每次重构复杂度 \(\mathcal O(n\log n)\),每 \(\mathcal O(\sqrt{n\log n})\) 次重构即可。

细节列表:

  • 随机撒点,将每个关键点跳到根并沿途打标记,如果碰到标记点就停止操作,将该点加入虚树。
  • 求 LCA,较为容易。
  • 很难维护深度,考虑仅维护关键点的深度,每次加点,将子树所有关键点深度 \(+1\),加点操作不会影响虚树形态,我们储存整棵虚树,dfs 即可。

551.算数

大概是九进制,每个进制的系数 \(<9\),若 \(>4\),可以进位然后用 \(\le 4\) 的负号表示。

552.第二题(b)

考虑二分答案,限制就是每个前缀的最大后缀和 \(\le lim\),设 \(f_{i,j}\) 表示前缀 \([1,i]\) 用了 \(j\) 次的最大后缀和最小是多少,每次只转移 \(f_{i,j}\le lim\) 的。

发现 \(f_{i,j}\) 关于 \(j\) 是凸的,于是平衡树维护差分数组即可,slope trick。

553.P7594 「EZEC-8」Clean Up

从充分性考虑,若一位位置被两次操作覆盖,根据等腰直角三角形的特殊性质,将这两次操作合并,更优。

从必要性考虑,对每个 \(i\) 来说,覆盖 \([i-a_i,i+a_i]\) 这些点的三角形与覆盖 \(i\) 的三角形是同一个,合并一下连续段,发现直接就是答案了!!

554.[ARC112E] Cigar Box

显然每种数只需关心最后一次操作。

那么有三种数,最后一次操作到前缀,最后一次操作到后缀,无操作,分类完就不用算顺序,显然每一类中的数是固定的。

枚举操作前缀的数个数 \(x\),操作后缀的数个数 \(y\),则答案为:

\[S(m,x+y)\cdot \binom{x+y}{x}\cdot 2^{m-x-y} \]

意义为将操作分成互不区分的 \(x+y\) 类,从中选出 \(x,y\) 类,每一类中最后一次操作的方向固定,那么只有 \(m-x-y\) 次操作的方向不定。

555.P9604 [IOI2023] 超车

满足单调的条件下,段数为 \(A\) 的函数与段数为 \(B\) 的函数复合后的段数不超过 \(A+B\),可以 \(\mathcal O(A+B)\) 合并。

设 \(f_i(Y)\) 表示 \(Y\) 时间经过调度点 \(i\) 后到达 \(i+1\) 的时间,于是我们要求 \(f_0,\cdots,f_{m-1}\) 的复合。

由于每段只会被至多一个车拖累,所以 \(f_i(Y)\) 是不超过 \(\mathcal O(n)\) 段的分段函数。

可以考虑分治合并,得出 \(\mathcal O(nm)\) 段的答案分段函数,时间复杂度 \(\mathcal O(nm\log m+q(\log n+\log m))\)。

556.P9967 [THUPC 2024 初赛] 采矿

容易想到设计状态,\(f_{s,j1,j2}\) 表示当前机器人在 \(s\),左子树人个数,右子树人个数,执行完前面操作的最大和。

注意这样状态数是 \(\mathcal O(n^2)\) 的。

对于 \(3,4\) 操作,容易维护。

对于操作 \(1\),从下往上,设计辅助转移 \(g_{u,0/1,j12}\) 表示机器人从 \(u\) 的左/右子树跳上来,对应子树的 \(j1+j2\)。

对于操作 \(2\),从上往下,设 \(g_{u,j}\) 表示机器人从上面跳下来,\(u\) 子树的机器人总和。

转移都是枚举分配给另一个子树的人数。

时间复杂度 \(\mathcal O(qn^2)\)。

557.FWT 进阶 遗传与进化

https://www.luogu.com.cn/article/y0unggsj

http://192.168.102.138/JudgeOnline/upload/attachment/file/20220627/20220627051951_62042.pdf

构造正逆变换矩阵,事实上 FWT 的正逆变换矩阵不一定必须互逆。
image

558.[ABC262Ex] Max Limited Sequence

显然每个限制只需关心值域上界在他范围内的点是否取到上界即可。

拎出一个值域上界的点和限制。

然后 dp,设 \(f_{i,j}\) 表示考虑 \([1,i]\),上一个填了上界的位置为 \(j\) 的方案数。

那么:

\[f_{i,i}\leftarrow \sum_{j<i}f_{i-1,j}\\ f_{i,j}=f_{i-1,j}\times w \]

考虑限制 \([l_j,r_j]\),相当于在 \(i\le r_j<i+1\) 时将所有 \(f_{i,k},k<l_j\) 赋值为 \(0\) 即可。

于是维护单点修,区间乘,区间求和即可。

559.P10432 [JOISC 2024 Day1] 滑雪 2

很妙的题。

\(5\to 42\to 100\),喜剧性的是漏了一个性质没观察到。

考虑如何判断合法,显然是 \(A_i\le \sum_{j<i} A_j-c_j+1\),若某个时刻不满足,就需要让前面的 \(A_i\) 增加直到恰好达到限制,我们需要操作在前面的 \(C_i\) 最小的值,发现前缀 \(C_i\) 最小的值必然留在前缀中(做的时候只会猜测fdjkgjdfklgjkljlkfgdjlkgfdklj)。

观察,若某时刻若干个数在位置 \(x\),则它们必然不会全部往上加,留下一个空位,\(x-1\) 前面连出来的树中一定会有叶子,所以我们在这若干个数中选择一个,连向那个叶子,并占用这个空位,更优。

于是最终的值域,是 \(\mathcal O(n)\) 的,所有能取用的值就是将数在值域上铺开之后的取值,且可以发现,答案 \(\le 10^{12}\)。

在这若干个数,我们贪心选择 \(C_i\) 最小的那个,更优,于是,值域从前到大,每个位置至少会有一个数,且前缀 \(C_i\) 最小的值必然留在前缀中。

就是类似一个筛选的过程,每次决定留下若干数在这个位置,留下的一定是按照 \(C_i\) 排序后前缀的数。

于是考虑 dp,设 \(f_{i,j,k}\) 表示考虑了 \([1,i]\) 的条件,有 \(j\) 个数加到了 \(i+1\),\(\sum_{j\le i}A_j-c_j=k\)。

直接转移是 \(\mathcal O(n^4)\) 的,不难推一推,用辅助转移数组优化,做到 \(\mathcal O(n^3)\)。

注意 dp 还是分成是否确定根的两部分。

560.斐波那契(fib)

image

妙妙,积性函数等于每个质数的对应占位函数的狄利克雷卷积。

然后 \(g*f=g\prod_{i=1}^{cnt} F_i\),其中练乘是狄利克雷卷积。

然后从小到大枚举,刚好可以避免枚举一个数,然后不断除的大常数写法。

561.再学 P5470 [NOI2019] 序列

给定两个长度为 \(n\) 的正整数序列 \(a_i\) 与 \(b_i\)。

分别对两个序列各指定恰好 \(K\) 个下标,要求至少有 \(L\) 个下标在两个序列中都被指定,使得这 \(2K\) 个下标在序列中对应的元素的总和最大。

至多 \(K-L\) 个下标不同。

那么可以建出费用流模型:

  • \((S,a_i,1,a_i)\);
  • \((b_i,T,1,b_i)\);
  • \((a_i,b_i,1,0)\),表示选择一对相同的下标。
  • \((U,V,K-L,0)\),表示任意配对的组合。
  • \((a_i,U,1,0)\);
  • \((V,b_i,1,0)\)。

考虑模拟 EK,那么与 \(S,T\) 相连的边不会退流。

那么每次必然选择一对 \((a_i,b_j)\),有如下情况的增广路:

  • \(i=j\)。
  • \(i\ne j\),消耗一个自由流量。
  • \(a_i\to b_i \to a_j\to b_j\),增加一个自由流量,并选择 \((a_i,b_i),(a_j,b_j)\),其中 \((a_j,b_i)\) 之前已选。
    • 诶,不妨思考为什么不会有更多退自由边的情况呢,拿图出来解释。
    • 结论:
    • 在非增量费用流中,源汇边不会退流。
    • 增广路不会多次经过同一个点。
    • 如果退更多自由边了,就会重复经过 \(U,V\),不优,故选择自由边数与退还自由边数的差绝对值(为什么呢,正着取和反着取会抵消,最终的结果就是不经过了)在增广路中不会超过 \(1\)。
  • \(a_i\to b_i \to a_k \to b_j\)。
  • \(a_i\to b_k\to a_j\to b_j\)。

但是由上面的话可能会发现问题了,如果我选择两条自由边,同时取消两条自由边呢?

其实就是证明正着取和反着取都不会超过一条。

手动画一下,发现要么不优,要么存在一张子图在之前不优。

因为反平反和正(平反)正的子图是不优的!!!!!

其中反指退还自由边,平指选相同下标,平反是取消相同下标,正指选自由边。

由上可以知道,我们在贪心的时候,有若干种最大费用流,我们是尽量让自由边更小的。

于是我们用五个堆维护上面的转移。

用 \(q_a,q_b\) 维护两侧未选的数的 \(\max\),\(q\) 维护未选的 \(a_i+b_i\) 的 \(\max\),\(q'_a,q'_b\) 维护本侧没选,令一侧选的数的 \(\max\)。

记 \(q,q_a,q_b,q'_a,q'_b\) 的堆顶为 \(s,a,b,a',b'\),则:

  • \(s\)。
  • \(a+b\),需要有自由流量。
  • \(a'+b'\),增加自由流量。
  • \(a’+b\)。
  • \(a+b'\)。

注意如果我们钦定是自由边,但是取出的平边的话,因为不优所以不用管他。

就做完了。

这下真会了。

562.P10221 [省选联考 2024] 重塑时光

诶。

竟然有 \(70\) 分的 bell 数搜索!!!

题面太复杂,以后还是要写一写简要题意!!

https://pan.quark.cn/s/42dd5d8118d9#/list/share/194e6a993036428c90c8118dedd29fd6-食贫道充电视频/4e031d9f129c4bc4b15ad039a152e62e-你好美国

563.P10360 [PA2024] Desant 3

妙妙题。

mx 里看过。

集中注意在这个对 \(2\) 取模,若 \(s_{a_1}\) 与 \(s_{b_1}\) 不同,操作完之后都是 \(s_{a_1}=0,s_{b_1}=1\),两种情况被抵消了,所以只需考虑 \(s_{a_1}=s_{b_1}\) 的情况。

初始所有位置未知,逐步执行操作,假设我们操作的是两个已知的位置,那么执行操作即可。

如果是两个未知的位置,那么可以只用算这两个位置相等的情况。

剩下假设 \(s_a=1\),而 \(s_b\) 未知,如果 \(s_b=1\),则结束后 \(s_a=1,s_b=1\),否则结束后 \(s_a=0,s_b=1\),那么发现直接作用就是交换 \(s_a,s_b\),然后发现我们将 \(s_a\) 改为未知,\(s_b\) 改为 \(1\) 的结果是一样的。

其他情况也是类似的。

那么我们对两个未知的位置,搜索确定它们是 \(0/1\) 即可,注意我们逐步执行操作的指针是对于每种搜索情况来说的,需要执行到碰到两个未知的操作才停止,然后去搜索是 \(0/1\),于是时间复杂度为 \(\mathcal O(2^{\frac{n}{2}}(n^2+m))\)。

这么说来有用的状态只有 \(\mathcal O(2^{\frac{n}{2}})\),这个 trick 感觉可以用来出题。

564.QOJ5020 举办乘凉州喵,举办乘凉州谢谢喵

草!

原来树状数组就算修改 \(\le n\),但是查询 \(\le 2n\),那么修改也要修改到 \(2n\)!!!

明天再写。

问题可以容斥为 \(z\to x,z\to y\),\(z\) 子树与这条链距离 \(\le d\) 的点数 \(+\) \(z\) 的 \(d\) 邻域 \(-2\) 倍 \(z\) 子树中距离 \(z\) 小于等于 \(d\) 的点数。

后面两者容易维护。

考虑前面,设 \(f_{x,d}\) 表示 \(x\) 子树内与 \(x\) 距离 \(\le d\) 的点数,\(g_{x,d}\) 表示 \(x\) 的轻子树内与 \(x\) 距离 \(\le d\) 的点数。

那么链上的贡献应该是链上所有点的 \(g_{x,d}\) 之和,减去 \(\sum f_{u_i,d}\),加上 \(\sum f_{hson_{vi},d}\),其中 \((u_i,v_i)\) 为链上的轻边,\(v_i\) 为 \(u_i\) 的父亲。

于是就做到了 \(\mathcal O(n\log ^2n)\)。

565.P7596 「EZEC-8」游戏蛇

和那道 cf 很像。

如果某个人决定转入链里了,那么我们可以判断他是否可以取得胜利。

  • 当另外一个人走到这个链点时,前者进去了,那么后者跟着进去就输了。
  • 另外一个人往中间的某个链去走,需要判断距离大小。

写出后面的限制,发现是单调的,可以对每个链点二分求得最大合法区间。

写出前面的限制,发现只是对链点所在位置的限制。

然后我们要分别对两个人求出最近能胜利的链点,这也能二分求得,判断那个人先到即可。

566.新居规划

关于退流会不会产生负环,我还不知道。

很妙的实现。

明天再写。

首先考虑环被占满的情况。

然后将环看作一条链,钦定最后一个位置是空的。

若有多个 \(>2\) 的连续段,我们中间部分全部插入到其中一个里面,转化为:若干孤立点,若干 \(2\) 段,至多一个 \(>2\) 段。

对于一个 \(2\) 段,我们将 \(b_i\) 较大的塞到 \(\ge 2\) 段的中间,不劣,所以进一步转化为:若干孤立点,至多一个 \(\ge 2\) 段。

先特判全是孤立点的情况。

那么我们会选出:\(p\) 个孤立点,\(2\) 个 \(a_i+b_i\) 的,以及 \(q\) 个内部点,满足 \(2p+3+q\le m\)。

考虑模拟费用流,对于多元的流量限制可以考虑从小到大增量枚举 \(x_2\),然后考虑退 \(x_1\) 的流即可。

不知为什么不会出现负环。。

http://192.168.102.138/JudgeOnline/problem.php?cid=1986&pid=1 这个题我也用这个做了,但是三元(这题也是三元)是对的,也不用消圈,然后四元不消圈全错,消圈部分错了。

567.但是题目有八个字

妙妙调整。

若某个操作顺序使得 \(\sum_{j<i}a_i>a_i\),那么将 \(a_i\) 插入到前缀和刚好超过他的位置之前,不劣。

不断调整,必然能结束。

于是对于一种顺序,只需考虑 \(\sum_{j<i}a_j<a_i\) 的贡献。

所以最优顺序就是从小到大取。

于是我们就从小到大只需计算 \(\sum _{j<i}a_j < a_i\) 的贡献。

再想想。

568.USACO2024DEC

569.数环(cir)

连续段 dp。

朴素实现是 \(\mathcal O(n^3)\) 的。

这个环满足一个左部点一个右部点,可以钦定加入右部点增加一个联通块,加入左部点时决策左右连接的右部点,然后将这两个联通块连接,最后一定能数到环。

image

570.数树(tree)

正常树上 dp,需要做一个和接近于 \(0\) 的包含 \(+1,-1\) 的序列的背包。

根据随机排列 \(+1,-1\) 序列的前缀和最大值为 \(\mathcal O(\sqrt n)\)。

我们可以随机排列儿子,并将背包大小设置为 \(\mathcal O(\sqrt n)\) 就能算到解了。

571.P11398

可以考虑分块,维护 \(c_{i,j}\) 表示前 \(i\) 块 \(j\) 的出现次数。

修改是 \(\mathcal O(\sqrt n)\) 的,查询需要 \(\mathcal O(\sqrt n)\) 还原一个块的答案,是 \(\mathcal O(\sum k+m\sqrt n)\) 的。

可以考虑倍增分块,最后一块大小为 \(1\),从后往前每一块大小是上一块的两倍。

这样多出来的需要还原的块的复杂度是和 \(k\) 同阶的,且只有 \(\log n\) 块,复杂度为 \(\mathcal O((n+m)\log n+k)\)。

572.QOJ8945 区间计数

我们希望数重复的区间,最多两个。

如果不交,条件就是 \(br(l,r)-bl(l,r)-(r-l)=0\)。

否则,就是存在 \(l\le l'\le r\),使得 \([l',r]\) 的对应区间不交,且对应区间右端点为 \(l-1\)。

考虑容斥,数条件一的数量 \(+\) 条件二的数量 \(-\) 满足条件一二的数量。

条件一是好做的,通过对 \(b\) 的一些限定,是可以做不交的。

条件二同样考虑对左端点扫描线,则 \(br(l,r)\) 单调不减,对于同一个 \(r\),其 \(br(l,r)\) 相同的时间 \([l_1,l_2]\),我们希望对 \([br(l,r)+1,r]\),只数一次。

所以维护一个“一血”标记,从 \(br(l,r)\) 被修改时,区间打上标记,当询问时,数区间有标记的最小值并将这些最小值的标记去除。

“删除区间最小值标记”是能做的,具体就是合并容易,下传只需考虑左右子区间的最小值是否是全局最小值即可。

对于条件一二,因为 \(br(l,r)\) 单调不减,发现我们就是数 \([l,r]\) 的对应区间为 \([2l-r-1,l-1]\)。

就是额外限定 \(br(l,r)=l-1\),二分单调栈找到那段区间,再查询最小值个数即可。

573.P8360 [SNOI2022] 军队

并查集结合序列分块。

记 \(fr_x\) 表示颜色 \(x\) 在块内第一个出现位置,用并查集维护 \(fr\) 的关系,可以找到一个位置的颜色,\(tg_x\) 表示颜色 \(x\) 的标记,\(sz_x\) 表示大小。

对于整块,将颜色 \(x\) 改为 \(y\):

  • 若 \(fr_x=0\),跳过。
  • 若 \(fr_y=0\),交换 \(x,y\) 的信息,并将 \(fr_x\) 的颜色设为 \(y\) 即可。
  • 否则,重构整块,均摊正确。

对于散块,只需重构 \(x,y\) 这两种颜色。

574.P10140 [USACO24JAN] Island Vacation P

绝妙题。

考虑修改题意,变成在广义圆方树上的游走。

记方点 \(val_u\) 为儿子个数对 \(2\) 取 \(\min\) 的值,若为 \(1\) 就是树边,否则是环。

定义圆方树上一个方点到 其第一个儿子再到其最后一个儿子回来为一个环

那么,设当前在圆方树上的点 \(u\):

如果不存在尚未走过的节点,结束。

  • 若 \(u\) 是圆点:有 \(p_u\) 的概率停下。

    设 \(s=[val_{fa_u}>1]+\sum_{v\in son_u \and [!vis_v]} val_v\),则有 \(\frac{[val_{fa_u}>1]}{s}\) 的概率走到他父亲环上的下一个点(取决于行走方向)。

    对于 \(u\) 的每个没有被访问过的儿子 \(v\),有 \(\frac{val_v}{s}\) 的概率走向 \(v\)。

  • 如果 \(u\) 的方点:如果以前没有访问过,那么等概率走向 \(u\) 的第一个或最后一个儿子,否则已经走完他的环了,回到父亲。

那么这样我们就将是否访问转到点上了。

那么可能的行走路径就是走到若干儿子里绕一圈,再回来,是若干嵌套的结构。

设 \(g_u\) 表示到达圆点 \(u\) 后走到其左右兄弟的概率,\(h_u\) 表示方点 \(u\) 从他的儿子下绕一圈回到 \(u\) 的概率。

记 \(F(x)=\prod_{v\in son_u \and [val_v>1]}(1+h_vx)\),那么 \(g_u=\sum\limits_i [x^i]F(x)\cdot i!\cdot (1-p_u)^{i+1}\cdot \frac{2^i}{\prod_{j\le i}(s-2j)!}\),注意这里指的是阶乘的前缀积。

这个式子的意思是选择 \(i\) 个儿子走回来了的概率,算上顺序,还有不结束的概率,然后每个要往下走的儿子有两种方向可以选择,其中 \(F(x)\) 可以背包算。

然后 \(h_u\) 即为他的所有儿子的 \(g\) 的乘积。

再设 \(f_{u,0/1}\) 表示:

  • 若 \(u\) 是圆点,那么 \(f_{u,0}\) 表示走到 \(fa_u\) 然后从 \(fa_u\) 走到 \(fa_u\) 的第一个儿子然后走到 \(u\) 的概率(注意并未考虑往下走然后回来结束的概率),\(f_{u,1}\) 同理。
  • 若 \(u\) 是方点,那么 \(f_{u,0}\) 表示走到 \(u\) 的概率,\(f_{u,1}=0\)。

初值 \(f_{1,0}=1\)。

对于方点 \(u\) 对儿子 \(f_{v,0/1}\) 的转移,有 \(f_{v,0}\) 就是 \(\frac{f_{u,0}}{2}\) 乘上 \(v\) 的前缀 \(g\) 的积,\(f_{v,1}\) 同理。

考虑从圆点 \(u\) 走到儿子 \(v\) 的转移,设 \(F(x)=\sum_{v'\in son_u\and v'\ne v}(1+h_{v'}x)\)。

那么 \(f_{v,0}=\sum_i[x^i]F(x)\cdot i!\cdot (1-p_u)^{i+1}\cdot val_v \cdot \frac{2^i}{\prod_{j\le i}(s-2j)!}\)。

那么停在 \(u\) 的概率就是 \(1\) 减去走向兄弟的概率,再减去走向某个儿子且不回来的概率。

不是兄弟,谁能做出来并调出来啊!!!

575.Kummer 定理

对于质数 \(p\),其在组合数 \(\binom{n}{m}\) 中的幂次等于 \(p\) 进制下 \(n-m\) 需要借位的次数。

\(\binom{n+m}{n}\) 中 \(p\) 的幂次等于 \(n+m\) 在 \(p\) 进制下进位的次数,因为 \(n+m-m\) 的借位次数等于 \(n+m\) 的进位次数。

576.P8861 线段

绝妙题。

没有二操作就是区间加,区间求和了。

考虑 \(l_i\le 10^5\le r_i\) 的部分。

始终满足如上条件,故左右端点是独立的,变成将 \(<x\) 的变为 \(x\),可以并查集维护,是均摊正确的。

这启发我们用类似猫树的结构维护,将每个区间插入到猫树上。

若一个节点区间被 \([ql,qr]\) 完全包含,那么没有变化。

故只需考虑 \(\log n\) 个节点。

若 \([ql,qr]\) 跨过中点,使用上述做法即可。

否则,假设 \(ql>mid\),对于一个区间 \([l',r']\),若 \(r'\ge ql\),则他会被弄到右子树中,做插入即可,每个线段只会被插入到 \(\log n\) 的区间,这也是对的。

就做完了,两个 \(\log\)。

577.P7737 [NOI2021] 庆典

考虑缩点后 dag 是联通的。

而题目中的性质告诉我们,每个点保留到他的那个点中拓扑序最大的到他的边,连通性不变。

故处理完之后就是一颗叶向树。

考虑建出 \(2k+2\) 个点的虚树,树边用链上 \(sz\) 和表示,非树边权为 \(0\),可以边开成点。

问题变成在给你一个有向图,问从 \(s\) 到 \(t\) 可能会经过多少个点,点边数较少。

正着搜一遍,反着搜一遍求交即可。

abb957357f1dc2663c7abbd4dfddcd9c

578.CF2048G

\[\sum_{k=1}^{v}\sum_{i=1}^{n}\sum_{j=1}^{m}(-1)^{i+j}\binom{n}{i}\binom{m}{j}k^{i(m-j)}(v-k+1)^{(n-i)j}v^{(n-i)(m-j)}\\ =\sum_{k=1}^{v}\sum_{i=1}^{n}(-1)^{i}\binom{n}{i}[(k^i-\frac{(v-k+1)^{n-i}}{v^{n-i}})^m-k^{im}]v^{(n-i)m} \]

579.范德蒙德卷积做一半

首先有:

\[\sum_{k=0}^{n+m}\binom{n+m}{k}x^k=(x+1)^{n+m}\\ =(x+1)^n (x+1)^m\\ =\sum_{r=0}^{n}\binom{n}{r}x^r\sum_{s=0}^{m}\binom{m}{s}x^s\\ =\sum_{k=0}^{n+m}\sum_{r=0}^{k}\binom{n}{r}\binom{m}{k-r}x^k \]

类似地:

\[\sum_{i=0}^{n}\binom{p+i-1}{i}\binom{n-i+q-1}{n-i}=\binom{n+p+q-1}{n} \]

右边来看,就是求 \(x_1+x_2+\cdots x_{p+q}=n\) 的非负解数,而我们枚举前 \(p\) 项的和求很好证明了。

换一种角度,就是 \((1,0)\to (p,i)\) 与 \((1,0)\to (q,n-i)\) 的方案数乘积,这可以变成 \((1,0)\to(p+q,n)\) 的方案数,注意后者路径是 \((p+1,i)\to (p+q,n)\)。

而如果我们要求:

\[\sum_{i=m}^{n}\binom{p+i-1}{i}\binom{n-i+q-1}{n-i} \]

这可以简单的看作从 \((1,0)\to (p+q,n)\),与 \(x=p\) 的相交最高点 \(\ge m\)。

发现这与与 \(y=m\) 的相交最左点 \(\le p\) 等价。

于是我们枚举相交最左点,有:

\[\sum_{i=1}^{p}\binom{i+m-2}{m-1}\binom{n-m+p+q-i}{n-m} \]

意义是 \((1,0)\to (i,m-1)\) 乘上 \((i,m)\to (p+q,n)\) 的方案数,很妙!!

580.P8367 [LNOI2022] 盒

要计算:

\[\sum_{i=1}^{n-1}w_i\sum_{j=0}^{S}|j-sum_i|\binom{j+i-1}{i-1}\binom{n-i-1+S-j}{n-i-1} \]

相当于我们要对 \(C=sum_i,S\) 计算:

\[\sum_{j=0}^{C}\binom{j+i-1}{i-1}\binom{n-i-1+S-j}{n-i-1}\\ =\sum_{j=0}^{A}\binom{B+j}{B}\binom{C-B-1+D-j}{C-B-1} \\ \sum_{j=0}^{C}j\binom{j+i-1}{i-1}\binom{n-i-1+S-j}{n-i-1}\\ = \sum_{j=0}^{C}i\binom{j+i-1}{j-1}\binom{n-i-1+S-j}{n-i-1}\\ =\sum_{j=0}^{C-1}i\binom{i+j}{j}\binom{n-i-2+S-j}{n-i-1} \]

那么就是 \((0,0)\to (C,D)\),与 \(x=B\) 交点最大值不超过 \(A\)。

可以变成 \((0,0)\to (C,D)\) 与 \(y=A\) 交点超过 \(B\),所以上式等于:

\[\sum_{j=B+1}^{C}\binom{A+j}{A}\binom{D-A-1+C-j}{D-A-1} \]

由于 \(sum_i\) 递增,我们可以模拟 \(A,B\) 的增加,变化时使用对应的式子。

581.P9361 [ICPC2022 Xi'an R] Contests

调整法。

若某一次跳跃的终点不是 \(y\),假设是用第 \(k\) 场比赛去跳跃的,那么我可以调整到能跳到的第 \(k\) 场比赛最小的点,于是每个点只有 \(\mathcal O(m)\) 个有效后继。

考虑倍增,可以合并,就做完了。

582.P9368 [ICPC2022 Xi'an R] Streets

处理出 \(va_v\) 表示 \(x_j-x_i=v\) 的最小的 \(a_i+a_j\),\(vb\) 同理。

那么我们就是要最大化 \(ij\),满足 \(i\times vb_j+j\times va_i\le c\)。

枚举 \(i\),二分判断 \(j\ge mid\) 是否存在合法的 \(j\),就是找最小值,求出 \((j,vb_j)\) 的凸包后可以二分。

考虑维护后缀凸包,从后往前建凸包,往栈里加点和删点就等价于是在树上新增一个儿子或者跳回父亲,最后得到一棵 \(\mathcal O(V)\) 个节点的树,每一个后缀凸包就对应一条到根的链,二分改成倍增即可。

考虑从小到大枚举 \(j\),判断一个 \(i\) 是否合法,因为 \(j\) 增大 \(i\) 是减小的,所以双指针即可。

时间复杂度 \(\mathcal O(TV\log V)\)。

583.P10181 龙逐千灯幻

超级妙妙 wqs 二分题。

首先有暴力 dp,令 \(f_{i,j}\) 表示 \([1,i]\) 分成 \(j\) 段,转移:\(f_{i,j}\leftarrow f_{k-1,j-1}+g(k,i)\)。

可以线段树优化做到单次 \(\mathcal O(n\log n)\)。

因为 \(g(i,j)\) 是凸的,而用凸函数划分序列的价值关于段数是凸的,即 \(f_{i,j}\) 关于 \(j\) 是凸的,使用 wqs 二分,转移变成了 \(f_{i}\leftarrow f_{k-1}+g(k,i)-c\)。

观察 \(a_i\le 30\) 的部分,则 \(g(k,i)\le 30\),那么当 \(c>30\) 时,\(g(k,i)-c<0\),一定是分成一段,所以预处理斜率为 \(0\sim 30\) 的 dp 值即可。

这启发我们,凸函数,当斜率较大时,切点较小。

设 \(F(k)=f_{*,k},D(k)=F(k)-F(k-1)\),因为 \(F\) 是凸函数,所以 \(D(k)\ge D(k+1)\)。

因为 \(F(k)\le n\),所以 \((k-1)D(k)\le \sum\limits_{i=2}^{k} D(i)\le F(k)-F(1)\le n\),所以 \(D(k)\le \lfloor\frac{n}{k-1}\rfloor\)。

那么考虑根号分治:

  • 对于 \(k\le B\),预处理。
  • 对于 \(k>B\),只需考虑斜率 \(\le \lfloor\frac{n}{B}\rfloor\),预处理。

时间复杂度为 \(\mathcal O(n\sqrt n\log n)\)。

想想优化空间,前面部分很好优化。

考虑后面部分,我们从小到大处理 \(c\),若 \(f'_{x,c}\le k\) 那么询问 \((x,k)\) 就能删掉了,因为这样 \(f'_{x,*}\) 是单调下降的,所以对于相同的 \(x\),按照 \(k\) 从大到小处理即可。

考虑优化,我们对 dp 数组做的操作是:

  • 末尾加数。
  • 后缀加 \(1\)。
  • 求最大值。

考虑维护后缀 \(\max\) 单调栈,那么 \(1\) 操作在末尾弹栈即可,\(3\) 操作就是找栈顶。

考虑 \(2\) 操作,需要找到后缀在单调栈上对应位置,并将他前面的若干东西弹出,那么考虑用链表维护单调栈,并查集找每个点右边第一个在栈内的元素。

至于加法,维护后缀差分标记即可。

时间复杂度 \(\mathcal O(n\sqrt n\alpha(n))\),空间 \(\mathcal O(n+m)\)。

584.P11065 【MX-X4-T5】「Jason-1」占领高地

妙妙!!

考虑从小往大加点,对于满足有向联通关系的两个点,将它们合并,使用启发式合并维护询问即可,具体就是将询问放在起点的终点,这样启发式合并的时候只需枚举小的一个联通块的询问。

问题是怎么找要合并的点。

发现 \((i,j)\to (x,y)\),那么也能到 \((x,j),(i,y)\),于是每个点能到的区域是一个矩形。

我们考虑钦定走的过程中曼哈顿距离不断加一,将军事化程度看成一个变化的值,如果往高度低的走就不变,平着走就 \(-1\),往上走就 \(-2\),这样 \((i,j)\to (x,y)\) 的条件就变成了存在一条起点到终点的初始值为 \(p_{i,j}\),末尾值 \(\ge 0\) 的路径,因为绕远路是不优的。

考虑设 \(r_{x,y}\) 表示之前激活的 \((i,j)\) 走到 \((x,y)\) 的最大军事化程度。

加入一个新的点 \((i,j)\),不断 bfs 相邻的点 \((x,y)\),若能更新 \(r_{x,y}\),就加入 \((x,y)\),这样钱数变多了,能走到的点也多了,需要更新。

因为 \(p_{i,j}\le 9\),于是 \(r_{i,j}\le 9\),每个点只会被更新常数次!!

还有另外一种做法。

因为每个点能到的点是一个联通块,我们可以将在范围内任意移动物资变成一步一步移动,考虑两个四联通相邻的格子,计算从其中一个格子移动到另一个格子的最大 \(h\) 值,问题就可以变成网格图的瓶颈路。

建出 kruskal 重构树即可。

令 \(f_{i,j,k}\) 表示覆盖 \((i,j)\),且 \(h_{x,y}-h_{i,j}+p_{x,y}-|i-x|-|j-y|\) 值为 \(k\) 的所有补给站中 \(h\) 的最大值。

根据上面的结论,一个点到另外一个点,一定可以先走横的再走竖的,那就可以转移了。

585.P8456 「SWTR-8」地地铁铁

结论牛牛题。

考虑容斥成数只有 \(0\) 路径、只有 \(1\) 路径,同时有 \(0\) 路径和 \(1\) 路径(不存在交叉路径)三种情况。

先看前两种。

性质 \(1\):点双经典性质:任意两点间存在点不相交的两条路径,即一个经过两点的简单环。

性质 \(2\):点双中,对于点 \(x\) 和边 \(e\) 存在经过 \(x,e\) 的简单环。

证明:设 \(e=(u,v)\),将边拆成 \((u,w),(w,v)\),不影响连通性,根据性质 \(1\) 存在经过 \((x,w)\) 的简单环,故 \(u,v\) 都在简单环上。

性质 \(3\):点双中,任意两点 \(x,y\) 和一边 \(e\),存在 \(x\to e\to y\) 的简单路径。

证明:由性质 \(2\),存在经过 \(x,e\) 的简单环 \(C\),考虑 \(y\notin C\) 的情况,考虑任意一条 \(y\to x\) 的路径 \(P\),考虑 \(P\) 与 \(C\) 的第一个交点 \(z\),显然 \(z\ne x\),否则 \(x\) 为割点,那么经过 \(z\) 跑环的另一侧就能构造了。

那么对于只有 \(0\) 路径的部分,若一个点双内存在 \(1\) 边,那么经过改点双的点对不合法,那么删去有 \(1\) 边的点双内部的边和点,保留边界上的,剩余联通块大小选 \(2\) 的和就是答案。

再看后一种,定义满足条件的点对为合法点对。

性质 \(4\):若合法点对间存在割点,那么交换一下,不合法,故合法点对属于同一个点双。

令 \(x\to y\) 所有 \(0\) 路径覆盖点集 \(V_0\),所有 \(1\) 路径覆盖点集 \(V_1\)。

性质 \(5\):由 \(4\) 得,\(V_0,V_1\) 无交。

性质 \(6\):\(V_0,V_1\) 之间无边。

性质 \(7\):点双中,任意三点 \(x,y,z\),存在经过 \(x,y,z\) 且以 \(x,y\) 为端点的简单路径,由性质 \(3\) 可以推出。

性质 \(8\):\(V_0\cup V_1=V\)。

证明:对任意 \(z\ne x,y\) 应用性质 \(7\)。

性质 \(9\):设 \(z\in V_0,z'\in V_0\) 且 \((x,y)\ne (z,z')\),存在 \(x,y\) 分别到 \(z,z'\) 或 \(z',z\) 的两条仅经过 \(V_0\) 的不交路径。

证明:若 \(z=x\) 或 \(y=z'\),显然。

考虑仅经过 \(V_0\) 的路径 \(P=x\to z\to y\),若 \(z'\in P\),显然。

否则考虑 \(z’\to y\) 的任意路径 \(Q\),考虑 \(Q\) 与 \(P\) 的第一个交点 \(p\),显然存在 \(p\ne z\),否则 \(z\) 是割点。

若 \(p\) 在 \(x\to z\) 上,则 \(x\to p\to z'\) 和 \(z\to y\) 无交点。

若 \(p\) 在 \(z\to y\) 上,则 \(x\to z\) 和 \(z' \to y\) 无交点。

所有,对于任意 \(z,z'\in V_0 \and (x,y)\ne (z,z') \and z\ne z'\),存在 \(x,y\) 分别到 \(z,z'\) 或 \(z’,z\) 的两条仅经过 \(V_0\) 的不相交路径,将这两条路径通过 \(x,y\) 之间的全 \(1\) 路径连起来,得到 \(z,z’\) 不合法。

同理在 \(V_1\) 内的点对也不合法,显然一个在 \(V_0\),一个在 \(V_1\) 的点对不合法,所以一个点双内部最多一个合法点对。

考虑充要条件:点双内恰好存在两个点满足同时有 \(01\) 出边。

必要性:\(x,y\) 合法,由性质 \(6\) 知只有 \(x,y\) 同时有 \(01\) 出边。

充分性:根据性质 \(7\),考虑任意 \(x\to u\to y\),路径必然同色,否则找到切换颜色的点,存在 \(01\) 出边,矛盾,因为 \(x,y\) 同时有 \(01\) 出边,所以存在全 \(0\) 路径和全 \(1\) 路径。

586.P10208 [JOI 2024 Final] 礼物交换

妙妙题。

对于 \(i\),向满足 \(B_j\le A_i \and i\ne j\) 的 \(j'\) 连边,然后做二分图匹配。

考虑 hall 定理。

考虑极端情况,对于 \(A\) 最大的 \(x\),需要于其他线段有交。

考虑扩展这一结论,首先发现所有线段与其他线段有交的必要的,否则拿出在这条线段左侧包含自己的集合 \(S\),显然 \(|N(S)|\) 只能为 \(|S|-1\),不合法。

再考虑证明充分性,对于任意 \(S\),取出 \(B\) 最小的 \(x\),则 \(B_x\) 与集合内的其他元素右边,邻域已经达到 \(|S|-1\),再拿出与他相交的线段 \([B_y,A_y]\),讨论:

  • 若 \(B_y< B_x\),则 \(y\) 不在 \(S\) 集合,而 \(y’\to x\),给邻域贡献 \(1\),合法。
  • 若 \(B_y>B_x\),则有 \(B_y\le A_x\),有 \(x’\to y\),继续讨论:
    • 若 \(y\in S\),则 \(y'\to x\),给邻域贡献 \(1\),合法。
    • 若 \(y\notin S\),则 \(y\) 给邻域贡献 \(1\),合法。

于是充要条件就找到了,预处理出 \(L_i\) 表示 \(i\) 编号左边与他相交的最大编号,\(R_i\) 同理。

考虑询问,不合法就是存在 \(i\),满足 \(L_i<l\le i\le r<R_i\),就是矩形覆盖单点查了,扫描线即可。

posted @ 2024-12-20 15:36  蒟蒻orz  阅读(150)  评论(0)    收藏  举报