heart heart
Solution Solution #
可以记 f ( u ) f ( u ) 为从 u u 出发到某个点停止的方案数,f ( u ) f ( u ) 可以 O ( n ) O ( n ) 转移,显然复杂度为 O ( n 2 ) O ( n 2 ) .
当前我们要转移 u u 子树内,对于 v ∈ subtree(u) v ∈ subtree(u) 我们记 g v g v 为 min p k > p j p k min p k > p j p k ,其中 k k 在 u u 到 v v 路径(不包含 u , v u , v )上的节点,仅当 p u < g v p u < g v 且 p u > p v p u > p v 时 v v 可以对 u u 贡献,我们可以用线段树维护 f ( u ) f ( u ) ,考虑线段树下标为 i i 的位置维护 p j = i p j = i 的 v i = g j v i = g j 和 s i = f ( j ) s i = f ( j ) ,我们可以先用对子树进行线段树合并然后考虑修改和查询
对于 k ∈ [ 1 , p i ] k ∈ [ 1 , p i ] 修改 v k ← min ( v k , p i ) v k ← min ( v k , p i ) .
查询 ∑ p i k = 1 [ v k > p i ] s k ∑ k = 1 p i [ v k > p i ] s k .
可以用 Segment Tree Beats Segment Tree Beats 维护,复杂度 O ( n log n ) O ( n log n ) .
「 USACO23OPEN 」 Triples of Cows P 「USACO23OPEN」Triples of Cows P
Solution Solution #
发现删点后连边操作是 O ( n 2 ) O ( n 2 ) 级别的,考虑建虚点来优化。
具体的,考虑我们将原树上点称为黑点,新建的虚点为白点,我们将边拆为一个点,我们将原树上的边 ( u i , v i ) ( u i , v i ) 变为 ( u i , n + i ) , ( v i , n + i ) ( u i , n + i ) , ( v i , n + i ) ,由于 n n 最后删去,我们可以以 n n 为根。我们删点可以直接将所有儿子合并到父亲上,用并查集维护时间复杂度就是 O ( n log n ) O ( n log n ) 的而且保证了图仍然是一棵树,原树 u , v u , v 直接相连等价于黑点 u u 和黑点 v v 同时是某个白点的邻接点,我们用 W W 表示 白点集合,用 B B 表示 黑点集合。
考虑如何算贡献,考虑计算五元组 ( a , x , b , y , c ) ( a , x , b , y , c ) ,其中 a , b , c ∈ B , x , y ∈ W a , b , c ∈ B , x , y ∈ W ,我们可以记录 f u , g u , h u f u , g u , h u 为 u u 的 1 / 2 / 3 1 / 2 / 3 级儿子数量。
x = y x = y ,我们可以在 x x 的邻接点中任选 3 3 个互不相同的点即可,贡献为
∑ u ∈ W ( f u − 1 ) f u ( f u + 1 ) ∑ u ∈ W ( f u − 1 ) f u ( f u + 1 )
x ≠ y x ≠ y ,我们可以枚举 b b 然后分为两种情况讨论
Case1: Case1: x x 为 b b 父亲,y y 为 b b 儿子,贡献为
2 ∑ u ∈ W f u h u 2 ∑ u ∈ W f u h u
Case2: Case2: x , y x , y 为 b b 互不相同的儿子,贡献为
∑ u ∈ B ∑ x ∈ son ( u ) f ( x ) ∑ y ∈ son ( u ) f ( y ) − ∑ x ∈ son ( u ) f 2 x = ∑ u ∈ B g 2 u − ∑ u ∈ W f 2 u ∑ u ∈ B ∑ x ∈ son ( u ) f ( x ) ∑ y ∈ son ( u ) f ( y ) − ∑ x ∈ son ( u ) f x 2 = ∑ u ∈ B g u 2 − ∑ u ∈ W f u 2
发现每次删点时只会改变 u u 的 1 / 2 / 3 1 / 2 / 3 级祖先,每次 O ( 1 ) O ( 1 ) 修改,复杂度为并查集的 O ( n log n ) O ( n log n ) .
A Dance of Fire and Ice A Dance of Fire and Ice
Solution Solution #
opt = 0 opt = 0 的操作只有最后一个有用,所以只需要考虑 opt = 1 opt = 1 的操作是否选择,由于取模为质数可以将模 p p 的乘法运算转化为离散对数的模 p − 1 p − 1 的加法运算,问题等价于求下面多项式的非零项个数(其中乘法运算是模 p − 1 p − 1 的循环卷积)
( 1 + ∑ opt i = 0 x v i ) ∏ opt i = 1 ( 1 + x v i ) ( 1 + ∑ opt i = 0 x v i ) ∏ opt i = 1 ( 1 + x v i )
考虑背包 DP DP 有 O ( n p ) O ( n p ) 的复杂度,背包每次会转移过多无效状态,考虑优化。
有效状态为 a x = 1 a x = 1 且 a ( x + v i ) mod ( p − 1 ) = 0 a ( x + v i ) mod ( p − 1 ) = 0 ,因为满足 a x = 1 a x = 1 且 a ( x + v i ) mod ( p − 1 ) = 0 a ( x + v i ) mod ( p − 1 ) = 0 和满足 a x = 0 a x = 0 且 a ( x + v i ) mod ( p − 1 ) = 1 a ( x + v i ) mod ( p − 1 ) = 1 的 x x 的数量相同,我们可以每次考虑 a x ≠ a ( x + v i ) mod ( p − 1 ) a x ≠ a ( x + v i ) mod ( p − 1 ) 的所有 x x ,不难发现这样的转移次数是 O ( p ) O ( p ) 的。考虑每次二分比较 [ l , r ] [ l , r ] 与 [ l + v i , r + v i ] [ l + v i , r + v i ] 是否相同,可以得到每次转移的 x x ,比较区间相同可以用树状数组维护 Hash Hash 比较,总复杂度为 O ( p log 2 p + n ) O ( p log 2 p + n ) .
「 CF1086F 」 Forest Fires 「CF1086F」Forest Fires
Solution1 Solution1 #
带权不好求考虑转化为 ( t + 1 ) F ( t ) − ∑ t i = 0 F ( i ) ( t + 1 ) F ( t ) − ∑ i = 0 t F ( i ) 其中 F ( x ) F ( x ) 表示在 x x 时刻着火格子数目。
F ( x ) F ( x ) 相当于所有点在 x x 时刻构成的着火矩形的并。
如果所有点的相交情况不变的话则有 F ( x ) F ( x ) 的二阶差分为常数,设矩形 i , j i , j 相交时间为 p ( i , j ) p ( i , j ) ,所有的 p ( i , j ) p ( i , j ) 将 F ( x ) F ( x ) 分为 O ( n 2 ) O ( n 2 ) 段,每段为一个二次多项式,每段前缀和为三次多项式,直接 Lagrange Lagrange 插值即可。
时间复杂度瓶颈在于求矩形并,可以扫描线 O ( n log n ) O ( n log n ) ,总时间复杂度为 O ( n 3 log n ) O ( n 3 log n ) ,足以通过原题。
Solution2 Solution2 #
搬题人把原题加强到了 n ≤ 2000 n ≤ 2000 ,考虑更优的做法。Lagrange Lagrange 插值做法存在扫描线的瓶颈,考虑其他思路。
矩形交可以转化为矩形并的容斥设 F ( S , t ) F ( S , t ) 为考虑点集 S S 中点时刻 t t 的矩形交
( t + 1 ) F ( t ) − t ∑ i = 0 F ( i ) = ( t + 1 ) ∑ S ( − 1 ) | S | + 1 ( F ( S , t ) − t ∑ i = 0 F ( S , i ) ) ( t + 1 ) F ( t ) − ∑ i = 0 t F ( i ) = ( t + 1 ) ∑ S ( − 1 ) | S | + 1 ( F ( S , t ) − ∑ i = 0 t F ( S , i ) )
我们令 g ( S ) = F ( S , t ) − ∑ t i = 0 F ( S , i ) g ( S ) = F ( S , t ) − ∑ i = 0 t F ( S , i ) 考虑如何快速算出。
对于 S , T S , T 满足 max u ∈ S , v ∈ S | x u − x v | = max u ∈ T , v ∈ T | x u − x v | max u ∈ S , v ∈ S | x u − x v | = max u ∈ T , v ∈ T | x u − x v | 且 max u ∈ S , v ∈ S | y u − y v | = max u ∈ T , v ∈ T | y u − y v | max u ∈ S , v ∈ S | y u − y v | = max u ∈ T , v ∈ T | y u − y v | 有 g ( S ) = g ( T ) g ( S ) = g ( T ) ,我们可以发现如果一个有 a a 个点确定的矩形中存在不参与确定矩形边界的点集 S S 如下图所示,则贡献为 ∑ | S | k = 0 ( | S | k ) ( − 1 ) k + 1 = [ | S | = 0 ] ∑ k = 0 | S | ( | S | k ) ( − 1 ) k + 1 = [ | S | = 0 ] 。
所以可以发现当左右边界确定后,唯一可以满足要求的点是 E , F E , F 在 y y 坐标的前驱后继
所以可以将点按 x x 排序,枚举确定左边界点和右边界点的点,用 multiset multiset 维护点的前驱后继维护贡献。
如何计算一个矩形的 g ( S ) g ( S ) ,其等价于考虑以矩形 4 4 个点为点集的 g ( S ) g ( S ) ,为一个三次分段函数,Lagrange Lagrange 插值即可。
总时间复杂度为 O ( n 2 log n ) O ( n 2 log n ) .
Walk Walk
考虑如何处理平方,可以转换
f ( S ) = ⎛ ⎝ ∑ p ⊂ S w ( p ) ⎞ ⎠ 2 = ∑ p ⊂ S ∑ q ⊂ S w ( p ) w ( q ) f ( S ) = ( ∑ p ⊂ S w ( p ) ) 2 = ∑ p ⊂ S ∑ q ⊂ S w ( p ) w ( q )
我们可以考虑有序路径对 ( p , q ) ( p , q ) 的贡献为 w ( p ) w ( q ) 2 n − | p ∪ q | w ( p ) w ( q ) 2 n − | p ∪ q | .
考虑 DP DP ,设 f ( u , v ) f ( u , v ) 为路径 p p 终点为 u u ,路径 q q 终点为 v v 的贡献,我们可以扩展 u u 到 u ′ u ′ (v v 同理),考虑转移式
f ( u ′ , v ) = 1 2 f ( u , v ) ⋅ w u ′ [ u ′ ∉ q ] + f ( u , v ) ⋅ w u ′ [ u ′ ∈ q ] f ( u ′ , v ) = 1 2 f ( u , v ) ⋅ w u ′ [ u ′ ∉ q ] + f ( u , v ) ⋅ w u ′ [ u ′ ∈ q ]
如果我们要将 u ′ u ′ 是否属于路径 q q 记录在状态上我们至少用 O ( 2 n ) O ( 2 n ) 的状态描述,但是 DAG DAG 我们可以钦定合理转移顺序。具体我们每次钦定转移拓扑序较小的点转移即可。复杂度为 O ( n 2 + m ) O ( n 2 + m ) .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具