2024.5 做题记录

362. CF553E Kyoya and Train

直接 dp,设 hiin 的最短路,fu,i 为到了点 u 用了 i 秒,还需要的最小期望花费。显然对于 i>tfu,i=hu+x,否则有:

fu,i=min(u,v,d)Ej=1ipjfv,i+j

显然是一个差卷积。分治 FFT 即可。

363. CF1965E Connected Cubes

智慧构造。

往每一行之间加一个空行(具体可以把这一行一直往右拖),然后每次用同一种颜色填充空行就可以了。

364. CF1172C2 Nauuo and Pictures (hard version)

和 wrx duel,结果两个人都没做出来。

这道题最妙的思想就是把每个照片拆成 wi 个权值为 1 的小照片,那么每个小照片的地位都相等,算出每个小照片最后期望的权值再乘 wi 就是答案。

剩下的部分随便 dp 即可。设 fi,j 为前 i 次访问到了 j 个(不)被喜欢的照片的概率,gi,j 为前 i 次访问到(不)被喜欢的照片中有 j 次访问到了当前的小照片的概率。转移是 trivial 的。

365. POJ3734 Blocks

考虑答案的 EGF 即为 (ex+ex)24×e2x=14(e4x+2e2x+1),EGF 第 n 项的系数即为 14n!(4n+2×2n),所以答案即为 14(4n+2×2n)

366. CF1967D Long Way to be Non-decreasing

考虑我们类似双指针一样维护当前的 ai,在它自增的同时一个一个 check。这样避免了类似“一个点在基环树上跳 k 步能到达的编号 x 的最小点”的问题。(事实上这一步非常妙。)

那么现在只用判断“uv 能否在 k 步内可达”。这是 trivial 的。维护 dfn 序,要么 uv 子树内,要么 u 能跳到 v 所在环。

367. CF1967E1 Again Counting Arrays (Easy Version)

贪心地判断一个 a 是否合法:bi 能增加就增加,不能增加就减少,这样能保证尽量使得 bi0

这能导出一个 dp 做法:设 fi,j 为考虑到第 i 位,当前 bi=j 的方案数。注意到一旦 jm 那么后面的 ai 就可以任选,所以这个 dp 是 O(nm) 的。

我们还可以考虑统计不合法的 a。枚举在某个位置 bi=0,ai+1=1。那么前面 b 向上走的步数可以算出。

现在相当于要算 (0,b0) 走到 (i,0),并且不触碰直线 y=1y=m 的方案数。直接反射容斥(类似 UOJ424 [集训队作业 2018] count),设触碰直线 y=1 为事件 A,触碰直线 y=m 为事件 B,那么答案即为 f()f(A)f(B)+f(AB)+f(BA)f(ABA)f(BAB)+f(x) 为终点依次沿 x 中直线对称后,起点到终点的方案数。这个方法的复杂度为 O(n2m)

这样我们的时间复杂度变为 O(min(nm,n2m))=O(nn),可过。

368. BZOJ4228 Tibbar 的后花园

条件相当于图由若干个链连通块和若干个环连通块组成,并且每个环的大小都不是 3 的倍数。

n 个点组成一条链的 EGF 为 f(x),组成一个环的 EGF 为 g(x),那么答案的 EGF 即为 ef(x)×eg(x)=ef(x)+g(x)

直接多项式 exp 即可。时间复杂度 O(nlogn)

369. P6936 [ICPC2017 WF] Scenery

很神奇的题,感觉还没完全搞懂。

考虑对于一个区间集合,设其最晚开始的完成时间为 C,其最小区间左端点为 s,那么 (Ct,s) 这个区间可以被标记成 forbidden,意思是这个区间不能开始拍摄任何照片,否则这个集合的要求就没法满足(只考虑拍摄时间 <s)。

所以我们的算法流程就是,从大到小枚举集合区间最小左端点,然后考虑所有可能的右端点,求出其最晚的开始时间,然后把一些区间设置为 forbidden。

时间复杂度 O(n2)

370. POJ1322 Chocolate

考虑答案的 EGF,就是 12c(ex+ex)cm×(exex)m

二项式定理展开,得答案为 12ci=0cm(cmi)j=0m(mj)(1)mj[xn]e(2i+2jc)x

最后答案还要乘上一些系数。

371. P10400 『STA - R5』消失的计算机

很有趣的造计算机题。

372. NC15254 白兔的***难

单位根反演:

ft=i=0n[kit](ni)=1ki=0nj=0k1ωk(it)j(ni)=1kj=0k1ωkjti=0n(ωkj)i(ni)=1kj=0k1ωkjt×(1+ωkj)n

发现这是一个 IDFT 的形式,并且 k 还是 2 的幂,所以直接 IDFT 即可。

373. NC18393 计数

套路单位根反演。

ans=T[kdTd]=1kTi=0k1dTωkid=1ki=0k1TdTωkid

套矩阵树定理算生成树边权之积的和即可。复杂度 O(k(n3+m))

374. P5401 [CTS2019] 珍珠

题意等价于出现偶数次的变量至少有 t=max(0,Dn+2m) 个。

二项式反演,设 fi 为钦定 i 个变量出现偶数次的方案数,那么:

fi=(Di)[xn](ex+ex2)i=(Di)2ij=0i(ij)[xn]e(D+2j2i)x=(Di)2ij=0i(ij)(D+2j2i)n

加法卷积即可。反演回去减法卷积即可。

时间复杂度 O(D(logD+logn))

375. CF891E Lust

首先一个不容易的观察:答案等于 i=1naibi=1n(aibi)nk。重点关注后面那坨东西。

ans=bi=1n(aibi)=bk!i=1nbi!SiSaiiS(bi)=SiSaibk!i=1nbi!iS(bi)

注意到 biS(bi) 只和 |S| 有关。设 |S|=t,那么这个东西等于 k![xk](xex)nt×etx=k![xk](x)ntenx=(1)ntnk(nt)k!(k(nt))!。可以 O(n2) 求出 fi=|S|=ijSaj,然后就做完了。

376. [ABC241Ex] Card Deck Score

答案即为:

ci=1n[cibi]aici

考虑生成函数,设 Fi(x)=j=0bi(aix)j。那么答案即为 [xm]i=1nFi(x)

考虑 Fi(x)=j=0bi(aix)j=1(aix)bi+11aix。分子可以 O(2n) 枚举乘了哪一项,这样可以知道分母需要贡献 x 的多少次方。我们重点关注分母。设现在要求分母的 xq 次项。

有一个常见套路是设 i=1nfi1aix=1i=1n(1aix)。因为 i=1nfi1aix=i=1nfiji(1ajx)i=1n(1aix) 所以可以列出 n 个关于 fi 的方程,可以高斯消元求解。

那么 [xq]1i=1n(1aix)=[xq]i=1nfi1aix=i=1nfi([xq]j0(aix)j)=i=1nfiaiq

总时间复杂度 O(n(2nlogm+n2))

377. [ABC318Ex] Count Strong Test Cases

首先做一些初步的观察:A 和 B 的解法是对称的,所以 A 对的方案数等于 B 对的方案数。同时若 A 和 B 同时对则每个置换环环长为 1,方案数为 n!

所以,若设 A 对的方案数为 x,那么答案为 n!2(xn!)(xn!)n!=n!2+n!x。所以转化为算 x

A 对当且仅当每个置换环的最大边刚好是编号最小的点的出边。设确定 pi 后环长分别为 l1,l2,,lm,那么安排边权的方案数为 n!i=1m1li,其中 n! 可以放到最后乘。

那么设环的 EGF 为 F^(x),有:

F^(x)=i0(i1)!i×i!=i01i2

其中 (i1)! 为长度为 i 的圆排列方案数。

设答案的 EGF 为 G^(x),有标号的组合对象拼接,可得:

G^(x)=i0F^(x)ii!=exp(F^(x))

那么 x=n!2[xn]F^(x)

时间复杂度 O(nlogn)

378. CF1007B Pave the Parallelepiped

容斥太复杂了,考虑不重不漏计数。

把所有数按是否为 A 的因数、是否为 B 的因数、是否为 C 的因数分类,然后再从每个集合中选数即可。

需要乘一个在大小为 n 的集合中选 m 个数的方案数 (n+m1m)

379. CF1028E Restore Array

憨憨构造。

首先若所有数都相等就特判,不是全 0 就不行。

否则设 b 最大值为 x,那么一定能找到一个位置 i 使得 bi1<xbi=x。将它旋转到 bn1,然后构造 ai 就做一个后缀和即可。

380. CF478E Wavy numbers

枚举前 7 位和后 7 位,meet-in-the-middle 即可。

381. P4723 【模板】常系数齐次线性递推

考虑构造矩阵 M,其中 M0,i=ai+1Mi+1,i=1,其余位置为 0。那么:

[fn+k1fn+k2fn]=Mn[fk1fk2f0]

M 的特征多项式为 φ(x)=xka1xk1a2xk2akx0

xn=Q(x)φ(x)+R(x),那么 Mn=Q(M)φ(M)+R(M)。又因为由 Cayley-Hamilton 定理得 φ(M)=0,所以 Mn=R(M)

R(x)=i=0k1rixi,列向量 F=[fk1fk2f0]。那么:

Mn=i=0k1riMiMnF=i=0k1ri(MiF)(MnF)k1=i=0k1ri(MiF)k1fn=i=0k1rifi

于是剩下的问题是求 R(x),也就是 xnmodφ(x)。直接多项式快速幂即可,每次次数超过 k 了就对 φ(x) 取模。

时间复杂度 O(klogklogn)

382. Gym100341C AVL Trees

考虑朴素 dp,设 fh,i 为高度为 h+1,结点数为 i 的树个数,有:

fh,i=j=0i1fh1,j×fh1,i1j+2×fh1,j×fh2,i1j

初值有 f0,0=f1,1=1

Fh(x)=i0fh,ixi,那么有:

Fh(x)=xFh1(x)(Fh1(x)+2Fh2(x))

因为 Fh(x) 的次数为 2h1,所以可以代入 ω2h+1 求点值,最后再代入求 Fh(x) 单点的值。

时间复杂度 O(h2h)

383. HDU7057 Buying Snacks

朴素 dp,设 fn,m 为考虑了前 n 种零食,花了 m 元。转移式为:

fn,m=fn1,m+fn1,m1+fn1,m2+fn2,m1+2fn2,m2+fn2,m3

Fn(x)=i0fn,ixi,有:

Fn(x)=(1+x+x2)Fn1(x)+(x+2x2+x3)Fn2(x)

矩阵快速幂即可,时间复杂度 O(mlogmlogn)

384. CF1326F2 Wise Men (Hard Version)

考虑子集反演,钦定 01 串中一些位置是 1,其余任意。

那么最后做一次类似逆高维前缀和即可。

考虑把一个人的排列分成极长的认识段,那么注意到段长集合相同的 01 串,方案数也相同。

所以我们先 dp 求出 fS,i 表示以第 i 个人结尾,以 S 中的集合作为点的链的个数,进而求出 gi,S 表示 |S|=i 且以 S 中的集合作为点的链的个数。

然后我们枚举 n 的划分,边递归下去边做 FWT 点乘,最后因为只用得到 2n1 处的值所以直接 O(2n) 朴素计算即可。

385. CF865G Flowers and Chocolate

F(x)=(ixpi)ngij=1|b|cbj=i 的方案数。显然 gi 满足线性递推,若往右平移 m1 位(设 m=maxi=1Bci),就是一个满足前 m 项只有一项有值的线性递推,设其特征多项式为 φ(x)

可以写出答案:

ans=i0[xi]F(x)[xm1](xm1+imodφ(x))=[xm1]i0(([xi]F(x)xm1+i)modφ(x))=[xm1]((xm1i0([xi]xiF(x)))modφ(x))=[xm1]((xm1F(x))modφ(x))

多项式快速幂即可。多项式部分可以使用朴素的 O(n2) 实现。

386. P4199 万径人踪灭

不连续的限制是好处理的,最后答案减掉不回文的子串个数即可。

考虑若求出沿某条线或某个格子为轴,相等的字符数量 c,那么这个轴的贡献为 2c1

直接 FFT 或 NTT 求 fx=i=0x(sitxi)2 即可。

387. P3784 [SDOI2017] 遗忘的集合

考虑生成函数,有:

F(x)=iS(1+xi+x2i+x3i+)n=iS11xi

两边取对数,有:

lnF(x)=iSj1xijj

F(x)ln 后再从小到大看 i 在不在 S 中即可。

388. CF335F Buy One, Get One Free

神仙反悔贪心。

考虑先把相同的物品压成一段。考虑一段物品时,求出可以白嫖的物品个数 p 和必须买的物品个数 q。再用一个堆把所有白嫖的物品存下来。

每次把堆顶拿出来,设为 t,设当前物品价格为 x

  • t<x 可以买 t 然后白嫖两个 x
  • 否则买 x,并且加入反悔物品 2xt

389. P5447 [THUPC2018] 赛艇

相当于是做二维差卷积。

但是不会做二维卷积怎么办!发现可以把他压成一维的,然后新坐标变成 mx+y,然后做完了。

390. P6049 燔祭

显然求出 m=[1,O(n)] 的答案,插值即可。

Fk(x)m=k 时答案的 EGF,设 Gk(x)=i=1kFk(x)

那么 m=k 时相当于是 Fk(x)=xexp(Gk(x))=xexp(Gk1(x)+Fk(x))=xexp(Gk1(x))exp(Fk)

利用 expF(x)O(n2) 递推的方法可以 O(n2) 计算出 Fk(x)。总时间复杂度 O(n3)

391. P5850 calc加强版

F(x)=i=1K(ix+1),答案即为 n![xn]F(x)

看到乘法直接考虑取 ln,有 lnF(x)=i=1kj1(1)j+1ijjxj

若求出 lnF(x) 就可以直接 exp 回去求出 F(x)

我们现在要对于 j[1,n],求出 i=1kij

考虑这玩意的 EGF:

G(x)=i0j=1kji=j=1ki0(jx)ii!=j=1kejx=e(k+1)xexex1

求出分母和分子前 n+1 项系数后分子卷上分母的逆即可。

注意到分子和分母可以提出一个 x 的公因式,然后分母的零次项就不为 0 了。

时间复杂度 O(mlogm)

392. P5162 WD与积木

考虑分别把总层数和总方案数求出来。

一层的 EGF 是 F(x)=ex1

总方案数的 EGF 是 i1F(x)i=11F(x)=12ex

总层数的 EGF 是 i1iF(x)i=F(x)(1F(x))2=ex1(2ex)2

求逆即可。时间复杂度 O(nlogn+T)

393. P10532 [XJTUPC2024] 筛法

不难发现每个数对恰好被统计一次,所以答案就是 n2

394. CF1965F Conference

考虑题目可以看成天和人的匹配,因此判断单个日期区间 [l,r] 可以考虑 Hall 定理,设 N(S) 为在 S 这些天有空的人的数量,定义 S 合法当且仅当 |N(S)||S|,那么 [l,r] 合法当且仅当 S[l,r]S 合法。

猜测只用 check 形成一段区间的 S,但是会被下面的数据叉掉:

3
1 3
2 2
2 2

对于 [1,3],只有 {1,3} 不合法。

因此考虑对初始的线段进行一些处理。发现对于两条线段 [a,b][a,c](其中 bc),把它们换成 [a,b],[a+1,c] 不影响结果(特别地,若 a=b=c 则相当于删去 [a,c] 这条线段)。这部分实现可以扫描线,枚举 l,把最小且 l 的右端点 rl 形成的线段 [l,r] 加入。

处理后每个人的线段的左端点互不相同,这时候就只用 check 形成一段区间的 S 了,因为若 |N(S)|<|S|x,yS 使得 [x+1,y1] 都不属于 S,那么加入 [x+1,y1]|N(S)|<|S| 仍然满足,因为每加一个数 |N(S)| 至多增加 1

所以此时不合法区间满足单调性,即若 [l,r] 不合法,那么 [l1,r],[l,r+1] 都不合法。

所以可以双指针求出,对于每个 l 最大的 r,使得 [l,r] 合法([l,r+1] 不合法)。

最后差分统计一下即可。

时间复杂度 O((n+V)logn)

posted @   zltzlt  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2023-05-02 AtCoder Regular Contest 119 F AtCoder Express 3
2023-05-02 AtCoder Regular Contest 119 D Grid Repainting 3
2023-05-02 AtCoder Regular Contest 117 F Gateau
点击右上角即可分享
微信分享提示