23.5 杂题

CF1612G Max Sum Array#

分析一下问题,考虑某 ci 个数在数组中的位置是 p1,p2,pci,那这些位置的贡献为 (2×ic1)xi。然后,这个排序不等式一下就好了。至于统计值搞一个差分前缀和就行了。

CF543E Listening to Music#

先稍微转换问题,对于所有 ai<x,相当于给所有 [i,min(i+m1,n)] 的右端点答案加一。最后就是求一个区间 min。于是有一个离线扫描线的 nlogn 做法。可持久化+标记永久化,可以做到 O(nlogn) 时空。考虑分块。

对于散块询问,我们需要知道的是块首的值。如果直接预处理是 O(nn) 空间的。考虑继续平衡复杂度,对操作继续分块。那么就相当于有 O(n) 个区间加,做一次区间查 min。差分一下复杂度就平衡下来了。

对于整块查询,由于整块加法是平凡的,我们只需考虑散块加法。而对于一个修改,散块加法只有 O(1) 次。于是在修改的时候对散块重构,重新记录散块的 min 即可。

CF1824A LuoTianyi and the Show#

假设已经有一个人了(没有就分别当 0m+1 有一个人),那么一类和二类都可以结合三类按照顺序往这个人的左边/右边放。如果有一个三类就暂时给三类让路。这样子可以 O(1) 判断。于是枚举第一个加入的三类人即可。

CF1824B LuoTianyi and the Floating Islands#

对于奇数,这样的点显然只有一个。而对于偶数,对于一条边,如果两边数量均为 m 这条边两个端点均可。于是对于每条边在下面的端点计数 (szum/2)×(nszum/2)。最后每组都少算了一个端点,加个一即可。

CF1824C LuoTianyi and XOR-Tree#

CF878D Magic Breeding#

好题,写篇题解记录一下。

首先如果值域是 {0,1},那么直接搞一个bitset维护一下。由于只有 2k 种不同的初始取值,所以维护 2k 长度即可。

然后考虑值域比较大的时候,直接枚举答案。把 < 的都设成 0,其余设成 1。那么从大到小枚举,第一个是 1 的部分就是答案的排名。

同理,这个也只有 2k 种取值,所以直接做的复杂度还是 O(q2kw)

CF961G Partitions#

这种题一般都考虑每个元素的贡献,枚举每个元素假设它所在集合大小为 s,那么它会贡献 (n1s1){nsk1},那么答案即为 i=1nwis=1n(n1s1){nsk1}

然后就是推式子,显然我们只需考虑后面式子。先把第二类斯特林数写成容斥的形式,把与 s 有关部分取出其他挪到前面,然后套路地把 s 拆成 1+(s1),剩下的就是一个二项式定理。

s=1ns(n1s1)i=0k1(1)i(k1i)nsi!(k1i)!i=0k1((1)(k1i)i!(k1i)!s=1ns(n1s1)ins)i=0k1((1)(k1i)i!(k1i)!(s=1n(n1s1)ins+s=1n(s1)(n1s1)ins))i=0k1((1)(k1i)i!(k1i)!((i+1)n1+(n1)(i+1)n2))

CF1464F My Beautiful Madness#

给定一颗大小为 n 的树,m 次操作,维护一个初始为空的路径集合 P

定义树上一条路径的 d 邻居(一个点集)S 为:xS 当且仅当存在一个路径上的点 y 满足 dis(x,y)d

操作分为三种:

  • 输入 u,v,在 P 中加入 uv 的路径。
  • 输入 u,v,删除 P 中一个 uv 的路径。(注意 uv 的路径与 vu 的路径是相同的,若有多个 uv 的路径只删除一个)
  • 输入 d,询问 P 中所有路径的 d 邻居交集是否为空,若不为空输出 Yes,否则输出 No

1n,m2×105.

首先我们分析问题实质,判断是否有交?那直接找到交集里的一个关键点不就好了?画一画图发现选取所有路径中 lca 最深的路径的 lca 向上跳 d 步的点即可,设为点 u。那么所有只要有一端在 u 子树内的路径都合法了。

考虑什么时候一定不合法,u 再向上跳 d 步得到 v。两端都在 v 子树外的路径显然就不合法了。还可以发现只有一端在 v 内的也一定合法了。剩下我们只需考虑两端都在 v 以内的。容易发现这种情况只需考虑路径的 lca 之间的最长距离是否大于 2d。也即 v 子树内路径 lca 的直径。由于不同点集的直径的可合并性,直接用线段树维护即可。

几种情况复杂度均为 O(nlogn)

HEOI2013 SAO#

容易发现这个图形成一个树形结构,虽然边是有向的,但我们不妨把他看成无向的然后跑树形 dp。

fu,i 代表在 u 的子树内 ui 名。然后转移考虑合并子树。枚举 i,j,k 表示原来 ui 名,vj 名,然后 u 在加入了 v 后变成了 k 名。于是就是从 k1 名中选 i1 名,后面同理,有转移 fu,k=ij(k1i1)(szu+szvkszui)fu,ifv,j。考虑 k 的范围,这里就会有两种情况:

  1. v 一定要在 u 后,这时显然只需 ki1+j 即可。

  2. v 一定要在 u 前,这时只需 ki+j 即可。

然后直接硬转移是 O(n3) 的,其实发现 j 这一部分是独立的,直接前缀和优化掉即可。

CF1097F Alex and a TV Show#

看到集合又只关心奇偶性所以想到可以用 bitset 维护,1 代表奇数,0 代表偶数。

直接维护每个数出现的奇偶性是不好搞 3 操作的。所以我们考虑维护每个数的倍数出现的次数,记为 f(x)。即假设每个数出现次数为 g(x)f(x)=x|yg(y)

那么根据莫比乌斯反演可得:g(x)=x|yμ(yx)f(y)。我们处理出所有 x 的倍数的位置,μ 函数在模 2 的意义下只有两种取值,将这些位置赋值为这些值,预处理出 bitset,然后与当前集合的 bitset 相乘,在模 2 的意义下即为与,最后 1 的个数的奇偶性即为答案。

再考虑 1,2,3 操作。

对于 1 操作,也可以预处理,不过原先的要先清空,然后再或起来。

对于 2 操作,如果不模 2 就是相加,所以模 2 意义下直接异或就好。

对于 3 操作,我们发现在原来就是两者相乘,于是现在模 2 意义下变成了与。

Gym104354D#

Gym104354J#

我绷不住了,这 sb 题打的时候为啥不写。。。直接分类讨论相交和相离(相切包含在任意一个当中均可)。然后就求一下和圆的切线长就完了。

Gym104354L#

CF1287A Counting Orders#

求有多少种重新排列 a 的方式,使得对于任意 1in,都满足 ai>bi,结果对 109+7 取模。

1n2×105,1ai,bi109,保证 ai 互不相同。

经典套路,从大到小考虑每个 bi,维护一个集合 S 代表可以放入的 ai。容易发现集合大小只增不减,于是可以每次直接乘上集合大小。复杂度 O(nlogn)

CF1287B2 Range Sorting (Hard Version)#

对一个数组 {pi} 的一段区间 [l,r] 排序的代价为 rl ,对整个数组 pi 排序的代价为选定若干区间并排序,使得整个数组有序的代价之和。

{ai} 的所有子段排序的代价之和。1n3×105,1ai109

对于一个串的答案是串长-最多能划分的连续段个数。也就是说对于一个子串 a[l:r],如果存在 i 使得 max(al,ai)<min(ai+1,,ar) 就会使得答案减一。考虑最经典的做法枚举 arcmax(alai)。记作 p,找到左边第一个大于 ap 的记作 Lp,右边同理记作 Rp。显然需要 i=Rp1。找到 Rp 之后第一个比 ap 小的。可以直接求出答案。复杂度 O(nlogn)

Bonus:如何做到 O(n)?对于每个 Rp1 维护所有 p,从后往前扫描线加入的顺序一定是按照 ap 递增的顺序。那么从后往前扫的时候维护一个单调递减的栈,按顺序弹栈即可(需要将 ap 逆序)。这里正确性是因为一定存在比起小的数在单调栈中。

CF1287C Palindrome Partition#

称一个字符串是好的,当且仅当它是一个长度为偶数的回文串或由若干长度为偶数的回文串拼接而成。

给定一个长度为 n 的字符串 s,求有多少 s 的子串是好的。1n5×105s 仅包含小写字母。

对于一个偶回文串,如果他有一个偶回文后缀,那么他一定可以划分成更多的偶回文串。对于每个位置 i,找出最短的以其为结尾的偶回文子串,转移即可。使用回文自动机可以直接记录,也可以使用 Manacher 是一个区间赋值的过程。其实是一个取 min 的操作,可以单调栈维护。复杂度 O(n)

CF1287D Two Centroids#

给定一棵树,初始只有 1 个编号为 1 的节点。接下来会做 n1 次操作,第 i 次操作添加一个编号为 i+1 的节点,并在节点 i+1pi 之间连边。

在每一次操作之后,至少需要多做多少次操作(加点加边),才能使这棵树具有两个重心。1n5×105

假设只有一个重心,显然是往重心的子树内不断添加叶子。设 k 为重心的重儿子子树大小,答案即为 n2k。动态维护重心只需要用 csps2019 树的重心的套路即可。

ARC101F Robots and Exits#

n 个人,m 个出口在一条数轴上,坐标是正整数。你每次可以让所有人向左或向右一步,人在某个出口上后就离开。求多少种操作的方案使得人全部走光。两个方案相同当且仅当存在至少一个人在两次操作序列进行完成后从不同的出口消失。对 109+7 取模。

1n,m105.

妙妙题。把每个点抽象成一个二维点 (ai,bi),横坐标是到左边出口的距离,纵坐标是到右边出口的距离。当 ai<aj,bi>bj 的时候,假设 i 从右边出去,则 j 也一定从右边出去,左侧同理。把左右走抽象成一条折线,在 (x,y) 这个位置代表从起点出发,最远的左侧点距离为 x 右侧为 y。把坐标向右上平移 0.5 个单位,那么折线下方的点都去右边,上方都去左边。假设我们已经确定了一个去右边的集合且满足上述性质,则一定可以找到一条满足条件的斜线。故我们可以直接dp,fj=ai<aj,bi<bjfi+1,这是个二维偏序问题,树状数组优化即可。

Gym104373D#

Gym104373B#

Gym104373G#

Gym104373H#

Gym104373I#

CF1815D XOR Counting#

给定 n,m,求所有 i=1mai=n 的非负整数序列,可能的 i=1mai 的值的和模 998244353

0n1018,1m105

m>2,考虑取 x,nx2,nx2,,就可以取便所有和 n 同奇偶的数。而 m 个数和为 n,异或起来的值一定和 n 同奇偶,所以自然就取便了所有值。

于是只有 m=2 的情况了。即 a+b=n,axorb 的不同可能的和。

考虑数位 dp,fi,0/1 代表前 i 位的答案,gi,0/1 代表前 i 位的方案数,最后的 0/1 代表是否进位。

n 这一位是什么分类讨论即可。不妨设这一位是 1,有如下转移:

fi,0fi1,1+fi1,0+gi1,0×2i
fi,1fi1,1

g 的转移是非常类似的。

code

CF1770E Koxia and Tree#

显然在决定一条边时两侧点的数量是确定的,这个东西看起来对每条边是独立的,转换为求期望,根据期望线性性求每条边的贡献和即可。记 fu 代表 u 上有标记的概率,两侧点的个数为 cu,cv。那么一条有向边 uv 的贡献即为:

12(fufvcucv+fu(1fv)(cu1)(cv+1)+(1fu)fvcucv+(1fu)(1fv)cucv)

对于 fu,fv 的维护,分类讨论一下。fu=12fufv+12((1fu)fv+fu)=12(fu+fv)fv 同理。

code

CF1821F Timber#

[1,n] 的区间里放 m 棵树,每棵树的高度为 k。求有多少种放置树的方法,满足:

  1. 每个树都在整点上,且每个点最多只能放一棵树。
  2. 存在一种砍倒树的方案,使得树倒了之后不会越界,也不会有某个点被超过一棵树占据。你可以自由选择树向左倒(也就是占据区间 [xk,x])或者向右倒(也就是占据区间 [x,x+k])。

求方案数。1n,m,k3×105

考虑有一个序列怎么倒,显然是从左往右贪心,能往左倒就往左倒。计 fi,j 代表最后倒在了 i,共有 j 棵树的方案数。转移显然是

2fi,jfl,j+1(i+k+1li+2k)fi,jfl,j+1(i+2k+1l)

显然可以写成关于第一维的生成函数,Fj(x)=(2tk+1xtt2k+1xt)Fi1(x)。那么答案可以写成 i=0n[xi](2tk+1xtt2k+1xt)m=i=0n[xim(k+1)](2t0xttkxt)m=i=0n[xim(k+1)](2xk1x)m

(2xk1x)m 上下同时二项式定理展开。得到 [xim(k+1)](2xk1x)m=pq[kp+q=im(k+1)](mp)(1)p2mp(m+q1q)。枚举 p,后面 q 的部分是一个前缀和,那么就做完了,复杂度 O(n)

code

如果不会生成函数,还可以组 合 意 义。类似的 dp,记 fi,j 代表考虑到了第 i 位,递推如下:

fi,jfi1,jfi,j2fik1,j1fi2k1,j1

可以看成格路计数问题。假设一开始在 (0,0),你可以向 (1,0) 方向走一步,贡献 1,或者向 (k+1,1) 方向走一步,贡献是 2,再或者是向 (2k+1,1) 方向走一步贡献是 1。最后求走到 (n,m) 的值。

枚举最后一种有多少个,即可算出答案:

i=0m(1)i(mi)2mi(n(2k+1)i(mi)(k+1)+mm)

code

如果想不到组合意义怎么办?直接容斥!

设第 i 棵树最后倒下的位置是 pi。这个 dp 告诉我们 pipi1k+1,然后对于 pipi12k 的部分有一个 2 的贡献。

先给 n 减去一个 m(k+1),于是现在限制变成了 pipi1k1 的有 2 的贡献。考虑容斥,钦定 i 个区间 k,方案数是 (mi)(nm(k+1)ik+mm)。二项式反演一下,答案为

ans=i=0m2mij=im(1)ji(ji)(mj)(nm(k+1)jk+mm)=2mj=0m(1)j(mj)(nm(k+1)jk+mm)i=0j(ji)12i=2mj=0m(1)j(mj)(nm(k+1)jk+mm)2j

殊途同归了。

posted @   Semsue  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
Title
点击右上角即可分享
微信分享提示
主题色彩