Typesetting math: 100%

12 月记录

529.CF2034F2

强化为 m 倍。

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

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

fx,y 表示在满足条件 (x,y) 时,生成的宝石数。

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

对于前者,转移为:

fx,yP(0,0,x,y)×(2x+y)

对于后者,转移为:

fx2,y2fx1,y1×P(x1,y1,x2,y2)[x1x2][y1y2]

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

时间复杂度 O(k2)

530.CF2042F

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

ab+bcac

image

531.CF2042E

手刃 clist *2800。

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

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

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

A

妙妙题。

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

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

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

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

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

时间复杂度 O(nmm)

B

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

C

非常妙的题。

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

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

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

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

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

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

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

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

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

D

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

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

E

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

状压找最小代价即可。

H

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

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

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

接下来考虑添加 pq,连接了两棵树。

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

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

I

很妙。

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

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

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

J

模拟题。

L

image

现在就是找到 f(L)f(R)KRL 最小然后 L 最小的解。

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

于是我们反向考虑,固定 L 是某次过题的时间,二分求出最小的过题时间 R 使得 f(L)f(R)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

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

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

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

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

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

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

时间复杂度 O(nlogn)

546.P7830 [CCO2021] Through Another Maze Darkly

妙妙题。

直接模拟感觉非常复杂。

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

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

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

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

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

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

询问可以离线下来做到 O(nα(n)+q)

547.P11364 [NOIP2024] 树上查询

笛卡尔树做法:

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

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

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

分治做法:

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

处理跨越区间的贡献,等价于每个点有权 ai,区间 [l,r] 的权为 min(al,ar)

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

考虑前者,容易处理。

考虑后者,发现一个询问区间只会有一次 Ll,Rr 的情况,对于这次二分特殊处理即可。

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

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

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

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

J

显然可以先修改再交换。

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

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

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

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

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

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

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

还有模拟费用流做法。

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


可以发现对于已经匹配的位置我们肯定不会去动它们,否则答案一定不够优。对于操作3其实等价于花|ij|ts的代价交换ij

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

进一步可以发现,如果[i1,j1]用了交换操作,那么对于i1i<jj1(i,j)我们都可以用交换操作。这是因为,一旦最优解里用了交换操作,则有|j1i1|tst0+t1,那么对于i1i<jj1(i,j),也是有|ij|t0+t1的。

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

  • 选择操作1或者2,那么dp(i)mindp(i1)+t0 or t1
  • 选择操作3,我们需要找到一个最大的j,使得区间[j,i]里都可以通过交换操作来搞定。然后dp(i)=mindp(j1)+cost(j,i)

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

D

I

很晕。

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

但是直接跑会有负权边。

考虑先求出 1 到所有点最短路 hu=disu,修改边权 w(u,v)w(u,v)+huhv,于是,新图上 1x 最短路加上 hx 就是原图上的最短路了。

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

于是我们模拟流,将这些边翻转,每条边的权依旧非负,并且将势能 hu 改为 hu+disu

再跑 1x 的最短路,加上 hu=2disu 就是答案了。

image-20241210113707881

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

于是先求出 disx,翻转最短路上的边,再求 disx,加上 2disx 就是答案。

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

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

image-20241210150237699

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

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

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

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

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

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

感觉很妙,但是。

aJ9X1-ncZPf9PrS0e2isd

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

考虑一个环,如果是奇环,那么任意状态都是可达的,答案就是 c0×c1×maxw,否则,奇偶性相同的任意节点都能聚在一起,答案为 (c0,0×c1,1+c0,1×c1,0)×maxw

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

接下来考虑树的情况。

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

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

考虑 dp,设 fi,l,r 表示链上第 i 个点聚集了区间 [l,r] 中的棋子,转移枚举下一段 [r+1,r] 在第 j 个位置,满足限制 jixr+1xr,于是 i,j,r 这三维是 O(n2) 级别的,总复杂度 O(n4)

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

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

查询,暴力 O(nA) 跳散块,整块二分 O(Alogn)

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

A=nlogn,时间复杂度 O(mnlogn)

加点考虑定期重构,每次重构复杂度 O(nlogn),每 O(nlogn) 次重构即可。

细节列表:

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

551.算数

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

552.第二题(b)

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

发现 fi,j 关于 j 是凸的,于是平衡树维护差分数组即可,slope trick

553.P7594 「EZEC-8」Clean Up

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

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

554.[ARC112E] Cigar Box

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

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

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

S(m,x+y)(x+yx)2mxy

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

555.P9604 [IOI2023] 超车

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

fi(Y) 表示 Y 时间经过调度点 i 后到达 i+1 的时间,于是我们要求 f0,,fm1 的复合。

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

可以考虑分治合并,得出 O(nm) 段的答案分段函数,时间复杂度 O(nmlogm+q(logn+logm))

556.P9967 [THUPC 2024 初赛] 采矿

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

注意这样状态数是 O(n2) 的。

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

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

对于操作 2,从上往下,设 gu,j 表示机器人从上面跳下来,u 子树的机器人总和。

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

时间复杂度 O(qn2)

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,设 fi,j 表示考虑 [1,i],上一个填了上界的位置为 j 的方案数。

那么:

fi,ij<ifi1,jfi,j=fi1,j×w

考虑限制 [lj,rj],相当于在 irj<i+1 时将所有 fi,k,k<lj 赋值为 0 即可。

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

559.P10432 [JOISC 2024 Day1] 滑雪 2

很妙的题。

542100,喜剧性的是漏了一个性质没观察到。

考虑如何判断合法,显然是 Aij<iAjcj+1,若某个时刻不满足,就需要让前面的 Ai 增加直到恰好达到限制,我们需要操作在前面的 Ci 最小的值,发现前缀 Ci 最小的值必然留在前缀中(做的时候只会猜测fdjkgjdfklgjkljlkfgdjlkgfdklj)。

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

于是最终的值域,是 O(n) 的,所有能取用的值就是将数在值域上铺开之后的取值,且可以发现,答案 1012

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

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

于是考虑 dp,设 fi,j,k 表示考虑了 [1,i] 的条件,有 j 个数加到了 i+1jiAjcj=k

直接转移是 O(n4) 的,不难推一推,用辅助转移数组优化,做到 O(n3)

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

560.斐波那契(fib)

image

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

然后 gf=gi=1cntFi,其中练乘是狄利克雷卷积。

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

561.再学 P5470 [NOI2019] 序列

给定两个长度为 n 的正整数序列 aibi

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

至多 KL 个下标不同。

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

  • (S,ai,1,ai)
  • (bi,T,1,bi)
  • (ai,bi,1,0),表示选择一对相同的下标。
  • (U,V,KL,0),表示任意配对的组合。
  • (ai,U,1,0)
  • (V,bi,1,0)

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

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

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

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

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

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

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

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

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

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

qa,qb 维护两侧未选的数的 maxq 维护未选的 ai+bimaxqa,qb 维护本侧没选,令一侧选的数的 max

q,qa,qb,qa,qb 的堆顶为 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 取模,若 sa1sb1 不同,操作完之后都是 sa1=0,sb1=1,两种情况被抵消了,所以只需考虑 sa1=sb1 的情况。

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

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

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

其他情况也是类似的。

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

这么说来有用的状态只有 O(2n2),这个 trick 感觉可以用来出题。

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

草!

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

明天再写。

问题可以容斥为 zx,zyz 子树与这条链距离 d 的点数 + zd 邻域 2z 子树中距离 z 小于等于 d 的点数。

后面两者容易维护。

考虑前面,设 fx,d 表示 x 子树内与 x 距离 d 的点数,gx,d 表示 x 的轻子树内与 x 距离 d 的点数。

那么链上的贡献应该是链上所有点的 gx,d 之和,减去 fui,d,加上 fhsonvi,d,其中 (ui,vi) 为链上的轻边,viui 的父亲。

于是就做到了 O(nlog2n)

565.P7596 「EZEC-8」游戏蛇

和那道 cf 很像。

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

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

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

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

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

566.新居规划

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

很妙的实现。

明天再写。

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

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

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

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

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

那么我们会选出:p 个孤立点,2ai+bi 的,以及 q 个内部点,满足 2p+3+qm

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

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

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

567.但是题目有八个字

妙妙调整。

若某个操作顺序使得 j<iai>ai,那么将 ai 插入到前缀和刚好超过他的位置之前,不劣。

不断调整,必然能结束。

于是对于一种顺序,只需考虑 j<iaj<ai 的贡献。

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

于是我们就从小到大只需计算 j<iaj<ai 的贡献。

再想想。

568.USACO2024DEC

569.数环(cir)

连续段 dp

朴素实现是 O(n3) 的。

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

image

570.数树(tree)

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

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

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

571.P11398

可以考虑分块,维护 ci,j 表示前 ij 的出现次数。

修改是 O(n) 的,查询需要 O(n) 还原一个块的答案,是 O(k+mn) 的。

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

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

572.QOJ8945 区间计数

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

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

否则,就是存在 llr,使得 [l,r] 的对应区间不交,且对应区间右端点为 l1

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

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

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

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

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

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

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

573.P8360 [SNOI2022] 军队

并查集结合序列分块。

frx 表示颜色 x 在块内第一个出现位置,用并查集维护 fr 的关系,可以找到一个位置的颜色,tgx 表示颜色 x 的标记,szx 表示大小。

对于整块,将颜色 x 改为 y

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

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

574.P10140 [USACO24JAN] Island Vacation P

绝妙题。

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

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

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

那么,设当前在圆方树上的点 u

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

  • u 是圆点:有 pu 的概率停下。

    s=[valfau>1]+vsonu[!visv]valv,则有 [valfau>1]s 的概率走到他父亲环上的下一个点(取决于行走方向)。

    对于 u 的每个没有被访问过的儿子 v,有 valvs 的概率走向 v

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

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

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

gu 表示到达圆点 u 后走到其左右兄弟的概率,hu 表示方点 u 从他的儿子下绕一圈回到 u 的概率。

F(x)=vsonu[valv>1](1+hvx),那么 gu=i[xi]F(x)i!(1pu)i+12iji(s2j)!,注意这里指的是阶乘的前缀积。

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

然后 hu 即为他的所有儿子的 g 的乘积。

再设 fu,0/1 表示:

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

初值 f1,0=1

对于方点 u 对儿子 fv,0/1 的转移,有 fv,0 就是 fu,02 乘上 v 的前缀 g 的积,fv,1 同理。

考虑从圆点 u 走到儿子 v 的转移,设 F(x)=vsonuvv(1+hvx)

那么 fv,0=i[xi]F(x)i!(1pu)i+1valv2iji(s2j)!

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

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

575.Kummer 定理

对于质数 p,其在组合数 (nm) 中的幂次等于 p 进制下 nm 需要借位的次数。

(n+mn)p 的幂次等于 n+mp 进制下进位的次数,因为 n+mm 的借位次数等于 n+m 的进位次数。

576.P8861 线段

绝妙题。

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

考虑 li105ri 的部分。

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

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

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

故只需考虑 logn 个节点。

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

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

就做完了,两个 log

577.P7737 [NOI2021] 庆典

考虑缩点后 dag 是联通的。

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

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

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

问题变成在给你一个有向图,问从 st 可能会经过多少个点,点边数较少。

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

abb957357f1dc2663c7abbd4dfddcd9c

578.CF2048G

k=1vi=1nj=1m(1)i+j(ni)(mj)ki(mj)(vk+1)(ni)jv(ni)(mj)=k=1vi=1n(1)i(ni)[(ki(vk+1)nivni)mkim]v(ni)m

579.范德蒙德卷积做一半

首先有:

k=0n+m(n+mk)xk=(x+1)n+m=(x+1)n(x+1)m=r=0n(nr)xrs=0m(ms)xs=k=0n+mr=0k(nr)(mkr)xk

类似地:

i=0n(p+i1i)(ni+q1ni)=(n+p+q1n)

右边来看,就是求 x1+x2+xp+q=n 的非负解数,而我们枚举前 p 项的和求很好证明了。

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

而如果我们要求:

i=mn(p+i1i)(ni+q1ni)

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

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

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

i=1p(i+m2m1)(nm+p+qinm)

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

580.P8367 [LNOI2022] 盒

要计算:

i=1n1wij=0S|jsumi|(j+i1i1)(ni1+Sjni1)

相当于我们要对 C=sumi,S 计算:

j=0C(j+i1i1)(ni1+Sjni1)=j=0A(B+jB)(CB1+DjCB1)j=0Cj(j+i1i1)(ni1+Sjni1)=j=0Ci(j+i1j1)(ni1+Sjni1)=j=0C1i(i+jj)(ni2+Sjni1)

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

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

j=B+1C(A+jA)(DA1+CjDA1)

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

581.P9361 [ICPC2022 Xi'an R] Contests

调整法。

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

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

582.P9368 [ICPC2022 Xi'an R] Streets

处理出 vav 表示 xjxi=v 的最小的 ai+ajvb 同理。

那么我们就是要最大化 ij,满足 i×vbj+j×vaic

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

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

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

时间复杂度 O(TVlogV)

583.P10181 龙逐千灯幻

超级妙妙 wqs 二分题。

首先有暴力 dp,令 fi,j 表示 [1,i] 分成 j 段,转移:fi,jfk1,j1+g(k,i)

可以线段树优化做到单次 O(nlogn)

因为 g(i,j) 是凸的,而用凸函数划分序列的价值关于段数是凸的,即 fi,j 关于 j 是凸的,使用 wqs 二分,转移变成了 fifk1+g(k,i)c

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

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

F(k)=f,k,D(k)=F(k)F(k1),因为 F 是凸函数,所以 D(k)D(k+1)

因为 F(k)n,所以 (k1)D(k)i=2kD(i)F(k)F(1)n,所以 D(k)nk1

那么考虑根号分治:

  • 对于 kB,预处理。
  • 对于 k>B,只需考虑斜率 nB,预处理。

时间复杂度为 O(nnlogn)

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

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

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

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

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

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

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

时间复杂度 O(nnα(n)),空间 O(n+m)

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

妙妙!!

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

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

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

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

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

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

因为 pi,j9,于是 ri,j9,每个点只会被更新常数次!!

还有另外一种做法。

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

建出 kruskal 重构树即可。

fi,j,k 表示覆盖 (i,j),且 hx,yhi,j+px,y|ix||jy| 值为 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,存在 xey 的简单路径。

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

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

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

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

xy 所有 0 路径覆盖点集 V0,所有 1 路径覆盖点集 V1

性质 5:由 4 得,V0,V1 无交。

性质 6V0,V1 之间无边。

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

性质 8V0V1=V

证明:对任意 zx,y 应用性质 7

性质 9:设 zV0,zV0(x,y)(z,z),存在 x,y 分别到 z,zz,z 的两条仅经过 V0 的不交路径。

证明:若 z=xy=z,显然。

考虑仅经过 V0 的路径 P=xzy,若 zP,显然。

否则考虑 zy 的任意路径 Q,考虑 QP 的第一个交点 p,显然存在 pz,否则 z 是割点。

pxz 上,则 xpzzy 无交点。

pzy 上,则 xzzy 无交点。

所有,对于任意 z,zV0(x,y)(z,z)zz,存在 x,y 分别到 z,zz,z 的两条仅经过 V0 的不相交路径,将这两条路径通过 x,y 之间的全 1 路径连起来,得到 z,z 不合法。

同理在 V1 内的点对也不合法,显然一个在 V0,一个在 V1 的点对不合法,所以一个点双内部最多一个合法点对。

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

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

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

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

妙妙题。

对于 i,向满足 BjAiijj 连边,然后做二分图匹配。

考虑 hall 定理。

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

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

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

  • By<Bx,则 y 不在 S 集合,而 yx,给邻域贡献 1,合法。
  • By>Bx,则有 ByAx,有 xy,继续讨论:
    • yS,则 yx,给邻域贡献 1,合法。
    • yS,则 y 给邻域贡献 1,合法。

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

考虑询问,不合法就是存在 i,满足 Li<lir<Ri,就是矩形覆盖单点查了,扫描线即可。

posted @   蒟蒻orz  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示