Typesetting math: 100%

杂题选写3

CF1009F Dominant Indices

暴力怎么做,就是 O(n2) dp。

考虑优化,那么就使用长剖+树上启发式合并,只留长儿子的信息,优化至 O(n),结束。

P7581 「RdOI R2」路径权值(distance)

首先考虑怎么计算 ukson 两两距离和。

首先套路地设其为 fu,k 先考虑树形 dp 转移。

在记录两个东西 g,h 分别表示 ukson 的 到 u 的距离和 和 数量。

那么转移 g,h 是简单的,hu,khv,k1,gu,kgv,k1+w×hv,k1

那么 f 也就能转移了,fu,kfv,k1+gu,khv,k1+hu,k(gv,k1+w×hv,k1)

这样是 O(n2) 的,考虑优化。

dp 的第二维是深度,考虑使用长剖优化。

长剖的时候是先走长儿子,对于长儿子不重复合并来保证复杂度的。但此处需要每个点 O(len) 更新 g,看起来非常邪恶。

由于 g 是一堆子树的点到 u 的距离和,可以变成 disvdisu

我们维护 g 表示 disv 的和,那么就有 gu,kgv,k1

又有 gu,k=gu,kdisuhu,k,那么我们在需要用 g 的时候用 g 算出来就好了。

复杂度 O(n)

P4338 [ZJOI2018] 历史

ZJOI,恐怖如斯。

首先考虑不带修怎么做。

首先容易观察到一次操作的权值就是虚实边的切换次数,给的 ai 就是 access 的次数。

考虑怎么计算 u 对答案的贡献。

首先,在 u 子树内的操作才会对 usonu 的边发生改变。

其次,改变当且仅当相邻两次操作来自 u 的不同子树内,或者恰有一次为 u

即,把操作为 u,操作在各个子树内的总 ai 各看成一种颜色,最大化相邻不同颜色的对数。

这个颜色的出现次数序列设为 A。令 s=A,m=maxA,那么有 ans=min(s1,2(sm))

证明考虑使用分类讨论,先把 m 排成一排然后插空,如果 smm1 就一定可以达到 s1,否则就是插了几个空就是几,为 2(sm),发现当 smm1 时恰好有 2s2ms1

那么现在不带修已经可以 O(n) 做了。

带修呢?

考虑在 [2ms+1] 上下功夫。

su=vTusv

由于当 2ms+1 时最多只有一个 Ai 满足,那么可以考虑使用 LCT 的虚实边来维护。

2susf+1 时就连实边,否则就连虚边。

考虑一次单点修改 vuv 的祖先,fu 的父亲。

(f,u) 是实边,那么只会变成实边,且贡献不变。

(f,u) 是虚边,那么暴力判断一下虚实与 f 的贡献即可。

由于一条路径上的虚边数量规模为 O(loga),因此这样就做完了。

找虚边可以直接用 LCT 找。复杂度 O(n(logn+loga))

细节有点多。

P6672 [清华集训2016] 你的生命已如风中残烛

震惊!游戏王原题!

结论题,答案是 m!mn+1,但是重点是,为什么。

合法的充要条件是 sii

考虑令 b=a1,那么一定有 sn=0,合法的条件是 si0

这个关于前缀和的形式,让人联想到 Raney 定理。

定理内容:设有整数序列 An 满足 Sn=1,则 A 的所有循环同构内恰有一个满足任意前缀和均为正数。

证明考虑倍长 A 并将 Γ(i,Si) 扔进坐标系,构造直线 k=1n 并从上向下平移直到恰好与图像 Γ 相切且再平移任意 Δ 都不交。

那么此时以这个点之后的那个点为起点一定合法,因为都在直线上或上方。

切点一定恰好只有两个,且对应同一个位置,因为斜率是 1n 而点都是格点。

如果是交而不切,过某一个 Γ 上的格点,那必有格点在直线下方,不合法。

考虑 Raney 定理与本题的关系。

考虑在 b 后面插入一个 1 并将序列取反再翻转,就变成了 Raney 定理里的 A

根据定理,这样的 A 是圆排列个数 (m+1)!m+1=m!

但是此时我们自己加进去的 1 和原来的 0 发生了混淆,这个 1 应当是所有 mn+11 中唯一的一个。

因此要去重,系数是 1mn+1

P3773 [CTSC2017] 吉夫特

首先需要每一项都是 1,也就是探究 (ab) 什么时候为奇数,已知 ab

根据 Lucas 定理,(ab)mod2=(a2b2)(a mod 2b mod 2)。后面那一项一共有 (11)=1,(10)=1,(01)=0,(00)=1

递归,发现 (ab)mod2=[ab=b],且在 a<b 时也成立。

t=loga,此时已经有了 n2t 的暴力 dp 做法。

考虑优化。

暴力 dp 要么是 O(2t)O(1) 的子集修改,要么是 O(1)(2t) 的超集查询,考虑优化。

考虑对前 b=t2 位在修改时枚举子集,剩下的位在查询时枚举超集以平衡复杂度。

那么修改和查询的复杂度都变成 O(2b) 了,就可以过了。

总复杂度 O(n2t2)


A,B 都是下凸壳时,做 (min,+) 卷积得到 C 的复杂度是 O(n) 的,具体地对差分数组合并就得到了 C 的差分数组。

证明考虑 C 是下凸壳,也是 A,B 的闵可夫斯基和,相当于 A,B 极角排序后按顺序合并。


同余最短路的转圈 trick:

对于模 m 的同余最短路中插入转移 v,考虑会形成 gcd(m,v) 的环,每个环在本轮答案更新独立。

又由于不会重复经过一个点因为不优,那在每一个环上转两圈就可以更新到所有答案。

总复杂度 O(nm),在物品数 n 很小时明显优于最短路。

AT_abc221_g [ABC221G] Jumping sequence

厉害题。

当你发现你不会做时,你就唐完了。

首先,现在不仅要决策操作的正负,还要决策操作于哪一维。

神奇的考虑将坐标系旋转 45\degree,然后在新的坐标系里每一维就独立了!

接下来就是解决一堆数填正负号凑出目标值来。

容易转化为一开始全都钦定填负号,然后背包填正号。

使用 bitset 优化可以 O(nVω) 判处答案。

那构造方案怎么办?

将每一次转移的 bitset 都记录下来然后从后往前搜就可以了,空间复杂度是 O(nVω) 的,可以过。

CF755F PolandBall and Gifts

首先有若干个置换环。

先考虑最大的情况。

先让所有环都是空的。

对于一个长为 2t1 的奇环,往里面塞 k 个球会产生的非空位置如下:

  • t1 个:不会产生非空位置,因为可以交替放。
  • t 个:产生一个非空位置,放在有连续两个空那边。
  • t1 个:每个会产生两个非空位置,只能插空。

偶环类似。

因此,我们贪心地先放不会产生的,再放会产生一个的,再放会产生两个的。

再考虑最小的情况。

先让所有环都是满的。

对于一个环,拿走第一个会产生两个空。之后在贪心最小的情形下,每拿走一个都会产生一个空,直到最后。最后一个拿走不会产生任何空。

也就是,只要一个环被拿了 k,那么只有全部拿完了,才会贡献 k,否则贡献 k+1

也就是最多有一个环不拿满,且能拿满就拿满。

也就是问这些环长为物品能不能恰好凑出一个大小为 k 的背包。

那么就是一个 01 背包了。

但是这个时候复杂度不太对,即使用了 bitset 也是类似于 O(n2ω) 的。

考虑优化,发现环长相同的可以一起算,可以优化成多重背包,经证明是 O(n32ω) 的,可以过。

P9140 [THUPC 2023 初赛] 背包

小心 inf 的大小。

观察到答案应该是后面全放性价比最高的那个,在一开始的时候会有一些聪明的乱放。

设这个性价比最高的物品体积是 v 价值是 c,类似同余最短路,我们要对于每一个 v 算出到 v+vk 的最小的 k

但是还有对应的价值,这怎么处理啊?

考虑修改要求的值,对于每一个 v 算出到 v+vkcick,也就是把重复的 c 贡献兑掉。

这一部分可以用转圈 trick 做到 O(nv)

这样的话最终查询 V 的答案就是 fV mod v+VV mod vvc

那就做完了。

P3642 [APIO2016] 烟火表演

很牛的 slope trick 题。

考虑从下往上做。令 fu(x) 表示仅考虑 u 子树内的叶节点,从 u 走到叶节点的距离是 x 的最小代价,容易发现 f 下凸。

边界情况的 f 是简单求的。考虑合并,从 fv 合并到 fu

容易感觉 fu=fv,考虑用 fv 推出 fv

fv 的极长常数区间为 [L,R]uv 的边长为 w,则

fv(x)={fv(x)+l,xLfv(L)+(l(xL)),LxL+lfv(L),L+lxR+lfv(L)+((xR)l),R+lx

对于 xL,由于斜率绝对值至少是 1,肯定不如缩短 l 绝对值就是 1 来的优,考虑尽量到达极长常数区间,于是就将 l 全部缩掉。

对于 LxL+l,考虑让 l 最少地减少以到达极长常数区间。

对于 L+lxR+l,本身就在极长常数区间。

对于 R+lx,考虑让 l 最少地减少以到达极长常数区间。

由于每一段斜率都是整数,因此可以用 slope trick。

考虑 fvfv 的过程,实际上就是将 (,L] 的部分向上平移 l,将 [L,R] 向右平移 l,在 [L,L+l] 插入一条 k=1 的直线,将 [R+l,+) 的斜率改为 1

这样的话,就可以用 slope trick 了。

维护拐点集合,ff 后与父亲合并,使用启发式合并即可。

最后要求答案,需要知道某一个位置的值。f1(0) 是简单的,相当于把树缩没了,也就是边权和。

复杂度 O(nlogn)

AT_arc119_e [ARC119E] Pancakes

容易发现一次操作的代价是 |ar+1ar|+|alal1||ar+1al||al1ar|,我们要最小化这个代价。

边界的情况是简单的,可以 O(n) 先算掉。

现在考虑中间的情况,即 l,r[2,n1]

考虑什么时候贡献是正的,容易发现就是放在数轴上时 (l1,l)(r,r+1) 是相交的。

具体地,分别是:(l1,r,l,r+1),(l1,r,r+1,l),(r,l1,r+1,l),(r,l1,l,r+1),(l,r+1,l1,r),(l,r+1,r,l1),(r+1,l,r,l1),(r+1,l,l1,r)

贡献都是中间两个之差的两倍。

前一半与后一半中相邻两个数的大小关系不同,考虑分开处理,以 aiai+1 为例。

那么就是要找出两条线段的交的最大值,且没有任何偏序限制。

直接找就好了。

AT_arc119_f [ARC119F] AtCoder Express 3

其实这种题是典题。

发现有两种点,先不管复杂度,套路地设 fi,a,b,0/1 表示已经考虑到了 i,到最后一个 A 类点的距离是 a,到最后一个 B 类点的距离是 b,当前点的类型是什么。

先不考虑往后走。

如果下一个点是同类点,以 00 为例,那么可以得到 a=a+1,b=b

如果下一个点是异类点,以 01 为例,那么可以得到 a=a,b=min(a+1,b+1)

你发现这个是 O(n3) 的,但是正确性是对的。

现在考虑往后走。

首先往后走边分为三类,分别是 00,11,i1i

首先走前两种边肯定很蠢,也就是同类点之间走不聪明,因为总是会走到曾经走到过的点。

那么考虑从 i1i,注意到只有异类才比较智慧。

比如 001000001,就可以 110 来优化最短路。

也就是,在更新的时候,如果下一个点是异类点,以 01 为例,那么可以得到 a=min(a,b+2),b=min(a+1,b+1)

此时你就会发现有 |ab|2,那么复杂度就是 O(n2) 的了。

AT_arc120_f [ARC120F] Wine Thief

如果我们能算出每个位置的贡献,那么就是 i=1naisi

考虑怎么求出 si

先考虑怎么求出长度为 i 选出 j 个的方案数 f(i,j)

把选看成染黑,相当于先放 j 个黑球再放 ij 个白球满足黑球不相邻。

那也就是在 j1 个空里各方一个白球,再将 ij(j1) 个球放进 j+1 个空里,可以空。

那么就是 f(i,j)=(ij+1j)

考虑怎么求 si,那么 i 一定选了,且 i1,i+1 一定不能选,那么先算上 f(n3,k1) 的贡献。

但是这样漏算了 i2,i+2 同时选的贡献,那么算上,此时 i3,i+3 一定不能选,那么算上 f(n7,k3) 的贡献。

但是这样漏算了 i4,i+4 同时选的贡献,那么算上,此时 i5,i+5 一定不能选,那么算上 f(n11,k5) 的贡献。

发现这是一个递归求解问题,那就递归直到边界就行了。

注意到如果左右两边有一边是空的就不需要再继续递归了,此时只有一边的贡献,再算上就好了。

复杂度 O(n)

P4557 [JSOI2018] 战争

相当于有两个凸包 A,B,不合法的情况就是 aA,bB,b+x=ax{ab,aA,bB}

好了,那么把 AB 算出来就好了,剩下的就是判断一个点是不是在凸包内。

那么闵可夫斯基和就可以了。

复杂度 O(nlogn+qlogn)

怎么求闵可夫斯基和呢?考虑先找出闵可夫斯基和上的一个点,然后将凸包 A,B 中的边极角排序之后归并排序,就好了。

P4610 [COI2012] KAMPANJA

其实是一个简单题。

注意到多次经过一个点只算一次,考虑怎么搞。

注意到范围很小,可以用高复杂度的 floyd。

发现事实上我们是要给环上重复经过的点去重。

fi,j 表示 1ij1 的最短路。

那么考虑去环之后长什么样,可以有转移 fi,jfx,y+dy,i+di,j+dj,x4

那么就做完了,貌似复杂度是 O(n4) 的。

竞赛图缩点

n 个点的竞赛图要缩点,怎么办呢?

首先结合题目性质算出每个点的入度或者出度。

重要性质:竞赛图缩完点之后就是一条大炮发射状链。

那么可以按照度从小到大排序。

每次找一段前缀 i,由于 i 个点的竞赛图边数为 i(i1)2,如果此时满足度的前缀和恰好为 i(i1)2,那么这就是一个连通块。

然后把这个连通块删掉,继续找下一个连通块。

同时,这个找到连通块的顺序就是拓扑序(或者它的倒序)。

P9676 [ICPC2022 Jinan R] Skills

容易有一个 O(n4) 的 dp,设 fi,d1,d2,d3,然后转移。

但我们会发现永远都会有一个 d1,且这就是上一次的操作位置,因此容易优化成 O(n3)

注意到如果一直不选那么代价会掉的非常快,粗略估计一下不能超过 O(V) 天。

那么可以优化到 O(nV),可以过了。

UOJ#37 【清华集训2014】主旋律

实在是太牛了。

需要求原图保留边集使得为强连通分量的方案数。

设点集 S 的答案为 fS,为 S 的导出子图的答案。

考虑总的方案数减去不合法的方案数。那么不合法就是原图缩点后形成若干 dag。

考虑枚举 dag 的入度为 0 的点分别是什么。

可以得到转移 fS=2e(S)TSk=1|T|(1)k1gk,T2e(TST)2e(ST),其中 gk,T 表示为点集 T 的导出子图分为 k​ 的强连通分量,且缩点后不含任何边的方案数。本质是子集反演。

考虑计算 gk,T,可以简单枚举得到 gk,T={fT,k=1ST,min(T)Sgk1,TSfS,k>1,其中 min(T)S 是为了防止算重,给每个添加进来的集合一个顺序。

此时复杂度过高,过不了,考虑优化。

hT=k=1|T|(1)kgk,T,其计算方式与 g 相似,可得 hT=fTST,min(T)ShTSfS

那么 fS=2e(S)+TShT2e(TST)2e(ST)

精细实现可以做到复杂度 O(3n),可过。

看起来计算 f,h 的时候有循环调用,但实际上当 fST=S 时肯定有 k1,因为不能把自己算进去。那么我们可以先算 hSfS 再算 fS 再算 hS


子集反演就是 fS=TSgTgS=TS(1)|S||T|fT

本质上就是 TS(1)|T|=[S=]

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

考虑总贡献除以方案数,令 fi 表示恰好分成 i 块且合法的方案数。

那么首先这 i 块可以随意重排列;同时,剩下的 k+1i 块空段可以随意插空;然后,这 k 刀可以以任意顺序切。

则答案为 i=0nfii!k!(k+1k+1i)(n+k)!

考虑求解 fi。令 hS 为点集 S 重排列后合法的方案数,那么枚举一个出度为 0 的点集 T 可以得到 hS=TShT[e(ST,T)=0],注意去重。

然后数块间方案数,就是 dag 计数,与主旋律类似。

gi,S 表示 S 划成 i 个互相没有边的块,那么有 gi,S=TSgi1,ThST[e(T,ST)=0][e(ST,T)=0],注意去重。

fi,S 表示 S 划成 i 个满足偏序关系的快,那么有 fi,S=TSj=1ifij,Tgj,ST(1)j1[e(ST,T)=0]

到这里就已经 O(3nn2) 了,可以获得可观的分数。

现在要考虑优化这个东西,注意到求 f 是一个卷积的形式,太慢了,考虑写出生成函数 GS(x)=i=0gi,S(1)i1xi

那么可以得到 FS(x)=TSFT(x)GST(x)

那么可以求出 O(n) 个点值,然后拉插出系数。

复杂度 O(3nn)

概率生成函数

若存在离散随机变量 X,其分布列为 P(X),可以定义其概率生成函数 PGF 为 F(x)=i0P(X=i)xi

这个东西存在一些性质,比如 F(1)=1

同时,期望 E(X)=i0iP(X=i)=F(1)

概率论中定义了方差为 D(X)=E((XE(X))2),可得 D(X)=E(X22XE(X)+E2(X))=E(X2)2E(X)E(X)+E2(X)=E(X2)E2(X)。依据是期望的性质 E(cX)=cE(X),E(c)=c

由于 E(X2)=i0i2P(X=i),容易发现 E(X2)=F(1)+F(1)

因此,D(X)=F(1)+F(1)(F(1))2

性质还有很多,但都不常用。

P4548 [CTSC2006] 歌唱王国

fi 为操作 i 后恰好结束的概率,其生成函数为 F(x),则 F(1) 即为所求。

gi 为操作 i 后仍未结束的概率,其生成函数为 G(x)

可得边界 f[0,m1]=0,g0=1

由于 gi=gi+1+fi+1,可以得到 xG(x)=i0(gi+1+fi+1)xi+1=F(x)+G(x)g0f0=F(x)+G(x)1

也就是 F(x)=(x1)G(x)+1,也就是 F(x)=G(x)+(x1)G(x),也就是 F(1)=G(1)

也就是我们只要求 G(1) 就好了。

hi 表示操作 i 后仍未结束,且接下来操作 m 次恰好把 S 随机出来,若提前结束则强制继续,的概率。

一方面,容易发现 hi=gi1nm

另一方面,注意到 S 出现的位置末尾下标 y 一定 [i+1,i+m],由于从 iy 的操作是 S 的后缀,同时又是前缀,可以得到 hi=j=1mfi+j1nmjisborder(S[1:j])=Tborder(S)fi+|T|1nm|T|

换句话说,可以得到等式 gi=Tborder(S)fi+|T|n|T|

也就是说,G(x)=i0Tborder(S)fi+|T|n|T|xi=Tborder(S)n|T|x|T|i0fi+|T|xi+|T|=Tborder(S)n|T|x|T|i0fixi=Tborder(S)n|T|x|T|F(x)

代入可得 G(1)=Tborder(S)n|T|F(1),又由于 F(1)=1,可得 G(1)=Tborder(S)n|T|

做完了。

指数生成函数

序列 f 的指数生成函数为 F^(x)=i0fixii!

考虑其卷积,容易发现 H^(x)=F^(x)G^(x)=i0j=0i(ij)fjgijxi

也就是说,这里的合并是有序的。

在合并无序时考虑 OGF,在合并有序时考虑 EGF,这就足够了。

同时,有 fi=pi 的 EGF 的封闭形式为 epx,证明考虑泰勒展开 ex=i0xii!

AT_arc136_f [ARC136F] Flip Cells

牛逼题。

令初始状态为 S,终止状态为 T

f(i;A) 表示从状态 A 开始走恰好 i 步到达状态 T 的概率,FA(x) 为其 PGF。

g(i;A) 表示从状态 A 开始走恰好 i 步首次到达状态 T 的概率,GA(x) 为其 PGF。

容易发现存在 GS(x)FT(x)=FS(x),那么就有 GS(x)=FS(x)FT(x)

由于求的是期望,那么 GS(1) 即为所求。

也就是求 FS(1)FT(1)FS(1)FT(1)FT2(1) 的值。

考虑求 FA(1),FA(1) 的值。

由于宏观上对于一个格子我们只关心其操作次数的奇偶性,因此考虑把奇偶性相同的放在一起考虑。

假设我们求出了 AT 恰好翻转了 t 个格子的方案数 ht,那么就可以算出 G^(x)=t=0HWhtP^1t(x)P^0HWt(x)。用 EGF 的原因是需要关系合并时候的有序性,需要乘上一个组合数系数。

其中 P^0(x)=i mod 2=0pixii!,P^1(x)=i mod 2=0pixii!,分别表示对于单个格子操作偶数次和奇数次的指数概率生成函数 PEGF,为了方便记 p=1HW

先考虑怎么计算 ht

dpi,j 表示前 i 行恰好翻了 j 个格子达到满足条件的方案数,那么 ht=dpH,t

考虑递推,枚举几个 1 翻成了 0,容易得到 dpi1,jk=0Ai(Aik)(WAiBi(Aik))dpi,j+k+(Bi(Aik))

这是简单的,复杂度 O(H2W2) 可以接受。

再考虑怎么去计算 P^0(x),P^1(x)

由于我们有 P^0(x)+P^1(x)=i0pixii!=epx,P^0(x)P^1(x)=i0(1)ipixii!=epx

那也就是说 P^0(x)=epx+epx2,P^1(x)=epxepx2​。

(从下面开始 P^0,P^1 就反了,将就着看。)

也就是说 F^(x)=t=0HWht(epx+epx2)t(epxepx2)HWt

现在我们要计算 G(x),考虑暴力拆式子,令 n=HW

F^(x)=t=0nht(epx+epx2)t(epxepx2)nt=2nt=0nht(epx+epx)t(epxepx)nt=2nt=0nhtj=0t(tj)epxjepx(tj)k=0nt(ntk)epxkepx(ntk)(1)ntk=2nt=0nhtj=0tk=0nt(tj)(ntk)epxjepx(tj)epxkepx(ntk)(1)ntk=2nt=0nhtj=0tk=0nt(tj)(ntk)epx(2j+2kn)(1)ntk=2nt=0nhtk=0nepx(2kn)j=0t(tj)(ntkj)(1)nt(kj)

由于 (x+1)a(x1)b=i=0a(ai)xij=0b(1)j(bj)xj=k=0a+bi=0k(ai)(bki)(1)kixi,故 F^(x)=2nt=0nhtk=0nepx(2kn)[xk](x+1)t(x1)nt=2nk=0nepx(2kn)[xk]t=0nht(x+1)t(x1)nt

我们先暴力求出 C(x)=t=0nht(x+1)t(x1)nt

那么 F^(x)=2nk=0nepx(2kn)[xk]C(x)

[xi]F(x)=[xii!]F^(x)=2nk=0n[xk]C(x)(p(2kn))i

那么,就有 F(x)=2nk=0n([xk]C(x))11(p(2kn))x

那么几乎就做完了。

代入 x=1,发现问题,当 k=n 时会出现 10

考虑令 HA(x)=(1x)FA(x)=2nk=0n([xk]C(x))1x1(p(2kn))x,那么还是 GS(x)=HS(x)HT(x)

x1H(x)=F(x)+(1x)F(x)

那么当 k=n 时外面的 1x 和里面的 1x 相消,对 H(1) 的贡献恰好是 2n[xk]C(x),对 H(1) 的贡献是 1

knH(1) 贡献为 0。对 H(1) 的贡献就是 2n11p(2kn)[xk]C(x)

做完了。

总复杂度 O(H2W2)

P3643 [APIO2016] 划艇

fi,j 表示考虑了前 i 个数且最后一个是 j 的方案数,可以 O(nV2),前缀和优化可以做到 O(nV)

考虑离散化,令 fi,j,k 表示考虑了前 i 个数且最后一个数位于段 j 且段 j 里已经选了 k 个的方案数,可以 O(n4),前缀和优化可以做到 O(n3)

wqs 二分

给定 n 个物品,需要恰好选 m (依题目条件而不同,比如连续段),最大化或者最小化权值和。

需要满足以下条件:

  • 若不限制选的次数,那么求解比较同意。
  • f(m) 为恰好选 m 次的答案,那么 f(m) 需要是凸函数

以上凸壳为例,由于斜率单调递减,我们可以二分 m 附近的斜率。

具体地,我们现在二分到了 k,我想知道现在是大了还是小的。

我们让这条直线恰好切到凸包于点 (x0,f(x0)),那么如果 k 符合条件就会有 x0=m

同时,充分运用切点的性质,发现其实就是所有过 (x,f(x)) 的斜率为 k 的直线中截距最大的。

也就是求 f(x)kx 最大值的 x 的取值。

那么我们就要去找 f(x)kx 的最大值和对应的 x

这个过程相当于每选一次都有 k 的代价,然后求最大代价,这个交给 dp 就好了。

P2619 [国家集训队] Tree I

令恰好选了 x 条边的答案为 f(x),通过一些感性理解,可以得到 f(k) 是一个下凸壳。

考虑 wqs 二分,斜率为 k,那么我们每选一条白边就有额外的 k 的代价。

我们去求一下最小值以及对应的 x。发现如果 x 大了需要将 k 调大,反之亦然。

然后就做完了。

[ARC168E] Subsegments with Large Sums

发现是恰好,考虑 wqs 二分,然后发现不是凸的,遗憾离场。

发现答案具有单调性,考虑先二分答案,转化为判断段数是否可以 k

构造一段的代价为 rl,那么代价之和就是 nx

f(x) 表示分成的段中恰好有 xs 个段的最小代价,那么 x 合法当且仅当 f(x)nk

由于要求代价最小,因此 <s 的段都是长度为 1 的段,对代价没有任何影响。于是只需要考虑 s 的段。

此时 f(x) 终于有了凸性,是下凸的,那么就可以 wqs 二分了。对于斜率 k,每一个 s 的段权值变为 rlk,然后 dp 求出最小值和对应的段数即可。

复杂度 O(nlog2n)

AT_abc305_h [ABC305Ex] Shojin

先考虑一个段内的答案怎么求。

首先对于 A=1 的全部扔到最后,这样显然不劣。由于贡献永远都是 B,因此可以直接忽略。

然后考虑邻项交换,A2(A1x+B1)+B2A1(A2x+B2)+B1B2A21B1A11,也就是说要按照 BA1 从小到大排序。

同时,一个段内 A>1 的个数至多是 O(logn) 的。

因此,考虑一个简单的 dp,令 fi,j 表示前 i 个数划为 j 段的最小代价,那么有转移 fi,j=minik=O(logn)fk,j1+w(k+1,i)

这样是 O(n2logn) 的,过不了,考虑优化。

发现 w(l,r) 满足四边形不等式交叉小于包含。因此 fi,j 关于 j 是下凸且单调递减的,考虑使用 wqs 二分优化。

二分斜率 k,那么现在要计算 fn,jkj 的最小值和对应的 j,交给 dp 就好了。

最后特判一下三点贡献即可。

复杂度 O(nlog2V)

CF1746F Kazaee

这题竟然使用哈希做的。

考虑集合哈希,先来一个随机映射,然后直接求和,若是 Yes 则一定是 k 的倍数。

但我们这样判断会将 No 判成 Yes,怎么办呢?

考虑多来几个。根据某些结论,判错的概率是 1k。那么我们同时上 T 个,错误率就是 1kT

总错误率大概需要 mkT103,同时复杂度为 O(Tnlogn),兼顾一下,取 T=28 可以通过。

P5537 【XR-3】系统设计

厉害题。

发现树的形态是不会变的,考虑预处理出根走到每一个点的序列。

然后对于一个询问就是将根到询问节点的序列与询问序列拼接,然后变成从根出发。

最后走到的点就是 lcp 最大的点。

考虑哈希,开一个桶记录所有节点的序列,就可以在线段树上二分处理询问了。

复杂度 O(nlogn)

傻逼玩意 n,m 写反浪费四个小时。

CF446C DZY Loves Fibonacci Numbers

f1,i=Fif2,i=Fi1,那么可以通过递推的方式得出 fj=af1+bf2

也就是说,修改就变成了关乎静态序列的区间系数加。

那么这个维护起来就十分容易了。

线段树复杂度 O(nlogn)

P2757 [国家集训队] 等差子序列

厉害题!

首先要找出是否有长度为 3 的等差子序列,那么中间的数就很重要了。

考虑从左往右扫一遍,由于是排列,可以记录每一个数是否出现过,设为 a

扫到数 p,就是找 a 中以 p 为回文中心的回文串,看能不能拓展到边界,也就是看边界是不是还是回文的。

然后就可以直接上一个哈希然后线段树,就没了。

复杂度可以 O(nlogn)

贝叶斯公式

对于均匀分布的随机变量,有条件概率 P(B|A)=P(BA)P(A) 为在 A 发生的条件下 B 发生的概率。

可以得到 P(B|A)P(A)=P(A|B)P(B)

此为贝叶斯公式。

CF1634F Fibonacci Additions

好题!

考虑令 Ci=AiBi,那么变成判断 Ci 是否全为 0

如果是区间加相同的数不用 ds 怎么做?用最原始的差分,令 Di=CiCi1,变成判断 Di 是否全为 0,此时区间加就变成单点加了,容易维护。

那是斐波那契呢?考虑沿用差分的思路,我们要构造 D 使得一段修改的中间值不变。

根据 0=fifi1fi2,可以构造 Di=CiCi1Ci2

那么就做完了。

P4323 [JSOI2016] 独特的树叶

要判断树的同构,考虑树哈希。

比如使用质数表哈希,考虑构造哈希函数 f(u)=1+vsonuf(v)P(szv)modM,其中 P 是质数表。

这样我们就可以比较有根树了。

对于无根的情况,可以换根之后让 n 个哈希值插入 set 中,然后查询一棵树是否同构就是那棵树随意找根哈希后判断是否存在于 set。

由于这种哈希值可以逆推,所以换根是简单的。

现在考虑另一棵需要删叶子的树,考虑也类似的去换根,然后枚举每一个叶子,把它的父亲当做根,然后根的哈希值减去 P(1) 就是删叶子之后的哈希值,然后直接查询即可。

CF2021D Boss, Thirsty

fi,l,r 表示前 i 的答案,然后你就完了。

考虑优化,因为有交且上不包含下,只会有四种情况,发现可以按照左右端点转移分类。

gi,l=maxr=lnfi,l,r,hi,r=maxl=1rfi,l,r,尝试大力分讨转移。

对转移的情况 [l,r][l,r] 分类:

  • l<l,此时 r 可以随便选,可得 gi,l=maxl=l+1n(gi1,l+maxj=lnsjsl1),容易优化。
  • ll,此时 r 不能随便选,可得 gi,l=maxr=ln(hi1,r+maxj=r+1nsjsl1),容易优化。
  • r>r,此时 l 可以随便选,可得 hi,r=maxr=1r1(hi1,r+srminj=0r1sj),容易转化。
  • rr,此时 l 不能随便选,可得 hi,r=maxl=1r(fi1,l+srminj=0l2sj),容易优化,

复杂度 O(nm)

P7668 [JOI2018] Dango Maker

如果直接暴力选所有可行的,就会出现冲突。

考虑冲突是怎么产生的,发现 G 一定是在对角线上距离为一分布。

那么于此 dp,就做完了。

CF2021E3 Digital Village (Extreme Version)

首先可以建出 kruskal 重构树。那么,两点间距离就变成了 LCA 点权。

令一个点是好的当且仅当子树中有 k 类点。那么一个 p 类点的贡献就是最近的好的点的点权。

gu 表示子树 up 类点的数量,valu=gu(auafau)afart=0

那么贡献就是所有子树内有 k 类点的点的 val 和。

证明考虑类似于拆贡献,一个 p 类点最近的好的祖先为 y 那么需要加上贡献为 ay=(ayafay)+(afayafafay)++(artafart)

那么就对完了!

接下来考虑怎么确定选 k 类点,考虑选一个 k 类点就给其到根的路径打上标记,那么我们要求每次打上标记的点点权和尽量小。

考虑从下往上合并,思想类似于 super piano's trick,处理到点 u 与子树的合并时,找到最短的子树加上 u 的贡献,并让这个状态向其他子树连边转移,就好了。

CF773D Perishable Roads

超级无敌神仙题。

注意到最终的生成树一定可以是根连出去一条链,链尾接一棵菊花,然后链和菊花的连接边的边权较小。

注意到这条边权较小的边一定是全局最小边。

注意到链上的权值一定单调不增,除了与最小边连的那一条边。

那么对于这个我们已经可以知道答案树的具体形态了,考虑如何计算答案。

考虑换根,计算在根上多接一个节点的贡献差,发现是 wminw

注意到最小边所连两个节点的答案是已知的。考虑以此建图,跑最短路,这样就可以得到每个点的答案了。

但是有一个问题,就是与最小边相连的那一条边的边权并不一定满足单调性。那么我们可以在一开始就特判掉,其贡献差为 2(wminw)

那么就做完了。

P7949 [✗✓OI R1] 左方之地

比较好的构造题。

考虑令第一个数为 0,我们构造差分序列。

首先把所有 popcount(x)=k 的数拿出来,这些是差分序列的值域,插入一个线性基。

那么取一组基出来,然后格雷码,然后做完了。

P4233 射命丸文的笔记

就是环数除以图数。

先算环数。枚举环的圆排列,剩下随便连,就是 (n1)!2(n2)n

再算图数。首先有存在哈密顿回路的竞赛图是强联通的,证明考虑反证。

fi 表示有 i 个点的强连通竞赛图的数量,gi 表示有 i 个点的竞赛图数量也就是 2(i2)

由于竞赛图缩点后为一条链,可以枚举竞赛图缩点后无出度的连通分量的大小。

可以得到转移式 gi=j=1i(ij)fjgij

发现是一个 EGF 的卷积的标准分治 FFT 的形式,考虑写成 EGF 的形式,可得 G=FG+g0。需要令 f0=0

g0=1,那么 F=11G,那么做完了,答案就是 [xnn!]F(x)

CF979E Kuro and Topological Parity

容易先从小到大加点,然后之前的点就变成黑白奇偶点了。

考虑一个点加进去的贡献,是容易计算的,全部写出来之后优化就可以了。

一个 trick:ip(ni)=2n1,p{0,1},证明考虑递推式 (ni)=(n1i1)+(n1i)

其实事实上递推式只和有没有奇点有关,所以 O(n5) 是容易优化至 O(n) 的。

posted @   luanyi1216  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示