12 月记录
529.CF2034F2
强化为 \(m\) 倍。
首先可以观察到,每条路径的概率相等,故我们只需计算所有路径的宝石和。
定义每次满足翻倍条件时,我们是将每个现有的宝石复制 \((m-1)\) 份。
设 \(f_{x,y}\) 表示在满足条件 \((x,y)\) 时,生成的宝石数。
每次满足状态时,我们要么由从箱子中抽取的宝石生成新宝石,要么由先前生成的宝石生成新宝石。
对于前者,转移为:
对于后者,转移为:
意义为由状态 \((x1,y1)\) 生成的宝石在当前生成新宝石。
时间复杂度 \(\mathcal O(k^2)\)。
530.CF2042F
似乎直接维护在区间中取了 \(1/2\) 个区间的最大值就好了,直接做模拟费用流的话非常麻烦。
\(a \oplus b+b\oplus c\ge a\oplus c\)。
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\) 无解。
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
现在就是找到 \(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\) 就是答案了。
这样就对了,因为我们只需证明在翻转了边之后的新图上,应用每个点的新势能,边权非负。
于是先求出 \(dis_x\),翻转最短路上的边,再求 \(dis'_x\),加上 \(2dis_x\) 就是答案。
考虑按照 dij
一样松弛就是 \(dis'_x\),我们希望找到一个顺序,使得提出 \(dis'_x\) 时它就是最优的。
那么我们只需要将被松弛的点放进堆中,每次取出最小的就能满足,前提是我们可以松弛所有情况。
首先考虑 \(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 $ 次,每条边也是。
感觉很妙,但是。
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\),则答案为:
意义为将操作分成互不区分的 \(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
的正逆变换矩阵不一定必须互逆。
558.[ABC262Ex] Max Limited Sequence
显然每个限制只需关心值域上界在他范围内的点是否取到上界即可。
拎出一个值域上界的点和限制。
然后 dp
,设 \(f_{i,j}\) 表示考虑 \([1,i]\),上一个填了上界的位置为 \(j\) 的方案数。
那么:
考虑限制 \([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)
妙妙,积性函数等于每个质数的对应占位函数的狄利克雷卷积。
然后 \(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
数搜索!!!
题面太复杂,以后还是要写一写简要题意!!
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)\) 的。
这个环满足一个左部点一个右部点,可以钦定加入右部点增加一个联通块,加入左部点时决策左右连接的右部点,然后将这两个联通块连接,最后一定能数到环。
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\) 可能会经过多少个点,点边数较少。
正着搜一遍,反着搜一遍求交即可。
578.CF2048G
579.范德蒙德卷积做一半
首先有:
类似地:
右边来看,就是求 \(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)\)。
而如果我们要求:
这可以简单的看作从 \((1,0)\to (p+q,n)\),与 \(x=p\) 的相交最高点 \(\ge m\)。
发现这与与 \(y=m\) 的相交最左点 \(\le p\) 等价。
于是我们枚举相交最左点,有:
意义是 \((1,0)\to (i,m-1)\) 乘上 \((i,m)\to (p+q,n)\) 的方案数,很妙!!
580.P8367 [LNOI2022] 盒
要计算:
相当于我们要对 \(C=sum_i,S\) 计算:
那么就是 \((0,0)\to (C,D)\),与 \(x=B\) 交点最大值不超过 \(A\)。
可以变成 \((0,0)\to (C,D)\) 与 \(y=A\) 交点超过 \(B\),所以上式等于:
由于 \(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\),就是矩形覆盖单点查了,扫描线即可。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18619417