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\)我们可以用一个两个栈维护0110匹配的情况,然后顺便也可以求出\(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  阅读(60)  评论(0)    收藏  举报