1月杂题

2023年了呢。

期末也终于考完了。

一.CF1336F Journey

题意:给你一棵 n 个点的树和上面的 m 条简单路径,问有多少对路径的交 k

n2105

做法:考虑两个路径有交时,lca 一定成祖先关系。

第一种情况:lca 不相等,简单,略。

第二种情况: lca 相等,且它们的交只有形如从 lcau 的一段。简单,略。

第三种,lca 相等,且交有两段。这个就比较困难了。

这个就是一个 (d[lca(ui,uj)]d[LCA])+(d[lca(vi,vj)]d[LCA])k

我们把所有 ui 的虚树建出来,进行一个启发式合并,那每次合并的时候就都要查一个形如:

iS[d[lca(v,i)]A] 的东西。

我们通过线段树维护 S 中的数的 dfn 序即可,查询就不难了。

所以合并的时候同样要对线段树进行修改,可以暴力插入?也可以线段树合并。

复杂度 O(nlog2n) 。很巨大啊这个题,我写了 4.9k。

二.ARC064F Rotated Palindromes(加强版:[SDOI2018]反回文串)

题意:一个串合法的条件是有一个回文串和它循环同构。

给出 nk ,问你有多少个合法串满足长度为 n ,每个位置都是正整数,且 k

n109 。(加强:n1018,多测,T10) 。

做法:感觉搞复杂了,但还是写写吧。

就是说可以考虑容斥。枚举集合 S 对于 iS,c[i,n]+c[1,i1] 是回文串。

S(b)=bi

改为枚举一个“环”差分数组满足 S(b)=n

然后可以证明,为了满足条件,令 V(b)=gcd(S(b),gcdi=1l2bi) ,则 c 有一个长度为 V(b) 的周期,证明略。

f(n) 是长度为 n 的回文串个数,这个很好算。

则式子可列为:n[S(b)=n]f(V(b))(1)|b|1/|b| 的形式。

踢掉常数,枚举 V(b),变成 nk|nf(k)[S(b)=n][V(b)=k](1)|b|1/|b|

我们分类讨论:

第一种是 n 为偶数,则 k 一定是 2 的倍数。令 N=n/2

我们令 Z(b)=gcd(S(b),gcdi=1lbi)

答案变成 nk|Nf(2k)[Z(b)=1][S(b)=N/k](1)(1)|b|1/|b|

通过莫比乌斯反演以及组合推导,令 P(n)=d|nμ(d)d ,则上式等于 k|Nf(2k)kP(N/k)

第二种是 n 为奇数,此时 V(b)=Z(b) ,就更直接了:答案等于 k|nf(k)kP(n/k)

每次算 P(x) 速度可以做到 δ(x)δ(n)n 质因子个数。

如果用 pollard-rho 分解质因数,可以做到 O(n1/4+σ(n)δ(n)logn) 。这个就是加强版了。

三. Baekjoon 19425 Line Counting

题意:有 n(n+1)/2 个整点,每个 (i,j) 满足 1ijn

问有多少条直线穿过了至少两个点。

多测,n2109

做法:令 T(x)=x(x+1)/2 。当 x<0T(x)=0

通过数学推导可得答案为 3i=1nφ(i)(T(ni)T(n2i))

展开多项式,分段计算。则我们需要计算 i=1nφ(i)ik ,其中 k<3 。这是杜教筛练习题。

四. CF1630F Making It Bipartite

题意:有 n 个点,有互不相同的点权。如果 ij 满足 aiaj 的倍数,则从 ij 连一条无向边。

求最少删掉多少点,使得图是二分图。

做法:有一个很好观察到的结论,就是如果不存在 i,j,k 满足 aiaj 倍数,ajak 倍数,那这个图就是二分图。

必要性显然,充分性可以反证一下。

结论换个说法,就是每个点只能连向比它小的点,或者比它大的点。

于是我们进行拆点建图,问题变成了 DAG 最长反链,就可以跑 Dinic 算了,复杂度 O(nn)

五.HDU6801

题意: n 个石子排成环,你会从第一个石子开始进行操作,直到所有石子都被移走:

一. 以 p 的概率移走当前石子。

二. 移动到下一个还没有被移走的石子。

对于 1in ,求出第 c 个石子是第 i 个被移走的概率。

n106

做法:枚举 c 是第几轮被删的,令 q=1p ,则答案的生成函数(这里我算反了,影响不大)可以写成:

(1q)i0qi(qi+1x+(1qi+1))c(qix+(1qi))n1c

考虑令 y=x1

答案写成 (1q)i0qi(qi+1y+1)c(qiy+1)n1c

踢开常数,二项式定理展开,交换求和顺序,可以得到 j0(cj)qjk0(n1ck)yj+ki0qi(1+j+k)

则等于 j0(cj)qjk0(n1ck)yj+k11q1+j+k

卷积计算即可。但是我们需要把 y=x1 带进去,用二项式定理展开,计算。这是一个差卷积的形式。

六.codefestival 2016 final I Reverse Grid

神题!

题意:给你一个 nm 的矩阵,每次可以翻转一列或一行,可以翻转若干次,求能得到多少种不同的排列。

n,m200

做法:

首先它一定是 (i,j),(n+1i,j),(i,m+1j),(n+1i,m+1j) 这四个位置的数在内部交换,我们称这是一个环。

我们考虑,如果依次操作第 i 行,第 j 列,第 i 行,第 j 列,那么它内部实现了位移,并且外部都是不变的。

可以通过程序验证,通过另外三个类似的操作,叠起来,可以得到 12 种不同的排列。这是非常神的一个构造。

我们令一个排列的奇偶性是 ipi 连一条边,环个数的奇偶性。则我们可以得到 24 种排列里所有为偶数的排列。

考虑一次翻转,对它覆盖到的环,奇偶性一定会改变。

得到结论:一个环,如果被覆盖偶数次,能造出 12 种排列,否则能造出另外 12 种。

需要注意的是,如果这 4 个位置有相同的数,则覆盖次数不影响,我们一定内部能构造出 4!/ci! 种组合。

现在问题就变成了,有 n 个变量 xim 个变量 yiai,j=xixoryj

在不关心一些 ai,j 的情况下,问能得到多少种不同的 a 序列。

我们把 a 看成一个 O(nm) 位的二进制数,则转化成,n+m 个二进制数,求线性基大小。

利用 bitset 优化,复杂度 O(n4/w) 。太好了这个题,每一步都很神。

ps:其实最后一步纯粹是小丑啊。考虑对于一个需要关心的 ai,j ,从 ij+n 连一条边。

那我们对于每一个连通块,随便取一个生成树,发现固定生成树上边的权值,其他的边也确定了,所以一个大小为 |S| 的连通块方案数就是 2|S|1

这就用并查集维护就好了。这个题复杂度是 O(n2) 的。

七.ARC153D Sum of Sum of Digits

题意:f(x) 是十进制下 x 的 popcount。给你 n 个正整数 ai,求 f(ai+x)(x0) 的最小值。

做法:这么套路的题这点人过?这场打了就是起飞场啊。结果我在教室里做物理卷子卡选择题(

就是你从低位到高位确定 x ,然后考虑每个 ai+x 的进位。

填完 j 位后,把 a 按照 j 位拼起来的值从大到小排序,则 ai+x 进位了的一定是一段前缀。

所以 dpi,j 记录 i 个数进位了,考虑到第 j 位,前 j 位这个 popcount 和 的最小值,转移一下就好了。

实现的好可以做到 O(10nlogA)

八.LOJ2469 最小方差生成树 (80pts)

一个树的方差是所有边边权的方差。

题意:给你一个无向图和一个 T,如果 T=1 ,则 1nm105 ,要求计算整个图的最小方差生成树权值;

否则 1n300,1m105 ,对于第 1im ,计算删掉第 i 条边后的最小方差生成树。

不保证联通,无生成树输出 1

做法:神题

首先方差可以看成 (xai)2 取到最小值。

一个 naive 的想法是,枚举可能的 x ,直接计算 aiai2。本质不同的 xO(m2) 个。这肯定是过不去的。

先把边从小往大排序。

我们考虑计算,一个边,在 x 处于什么范围时,会被选到最小生成树里。如果 xai ,则满足 aj2xai,j<ij ,会在 kruskal 时被先考虑。

(我们令 kruskal 时 (aix)2 为第一关键字,编号为第二关键字。)

所以我们把边从小往大排序后,计算从 i11 ,依次加边,计算什么时候 uivi 联通,计为 li,则 x>(ai+ali)/2

同理可以计算一个 ri ,事实上不难证明 rli=i 。则 x(ai+ali2,ai+ari2]

计算 li 的过程就是一个求最大生成树的过程,从小往大加边,利用 LCT 把 uivi 的路径上最小的边给删掉。

这就是 T=1 了。复杂度 O(nlogn)

T=2 时,我们先同样计算出一个最小方差生成树,则除开这树上的 n1 条边,删掉其它边都没有影响。

对于这 n1 条边,我们考虑删掉一条边 i ,其它边的 lj 会怎么变化。

我们把 i+1m 这些边的最小生成树 T1 弄出来,不难证明只有这上面的边 li 会变化。但是怎么求新的 li 呢。

我们把 1i1 这些边的最大生成树 T2 弄出来,从大往小把边加进 T1 即可,当加入 x 使得 y 被删时,ly=x

这一步事实上通过求最大/小生成树,排除了若干没用的边,把边的个数控制在 O(n)

实现好的话就能做到 O(mlogm+n(m+nlogm)) 。事实上这里不需要 LCT 的,可以暴力实现,做到 O(n(m+n2))

至于为什么是 80 pts,我难得调高精了。

九.CF1783G Weighed Tree Radius

题意:给你一棵树(无边权)以及点权 ai0 。定义 eu=maxi=1n(dis(u,i)+ai)r=mini=1nei

q 次修改单点点权,每次修改后输出 r 的值。

做法:首先,如果点权都是 0r 就是直径除以 2 上取整。

现在,我们在每个点上接两条长度为 ai 的链。原树的 ei 就是新树上点 i 能到达的最远距离。

把新树的直径求出来,则有 rd2 。可以证明,直径的中点 mid 一定在原树上:

由于它是直径,则 2auau+av+dis(u,v)auav+dis(u,v) 。所以 aud2mid 不会在接的链上。

问题转化成求新树的 d ,这是经典 ds 题啦。

十.ARC154E Reverse and Inversion

题意:给你一个排列 p,每次操作你会等概率的选择一个二元组 1ijn ,然后翻转 plpr

f(p) 是 所有满足 i<j,pi>pj 的二元组的 ji 的和。求 m 次操作后 f(p) 的期望。

做法:

首先简化 f(p) 。考虑把 ji 拆开,令 g(i)=[j<i,pi<pj][j>i,pi>pj] ,则 f(p)=ig(i)

x=[j<i,pi<pj],y=[j>i,pi>pj],z=[j<i,pi>pj] ,则 x+z=i1,y+z=pi1 ,xy=ipi

综上,f(p)=i(ipi)

接下来考虑一个值 x 所在的下标的期望。如果它从未被选中操作过,则下标是确定的。从未被选中的概率容易计算。

若被选中过,则下标的期望是 (n+1)/2 ,因为考虑它最后一次被操作,如果原来在 i ,换到 j 的二元组个数是 min(i,j,n+1i,n+1j) ,换到 n+1j 的个数是一样的。

这个题就做完了,复杂度是 O(nlogm)

十一.CF1687E Become Big For Me

题意:给你一个序列 ai,你一开始有一个数 v=1 ,你可以选 a 的一个子集,令子集中的数的最小公倍数为 x,你可以使 v:=vx ,或 v:=v/x

使得最后 v=gcd(aiaj)(1<i<jn) 。给出一个方案。

n105ai106 ,操作数不超过 105 次,每次选的集合的大小之和不超过 106

做法:神题!

首先,想求一组数的 gcd ,可以利用 min-max 容斥表示成一个 lcm(T)(1)T1 的形式构造出来。这是很重要的。

我们求 gcd 时只需要保留那些在某一个质数上次数最小的数。

106 的数不同质因子至多有 8 个。

如果任取一个数 x ,那么除了它的 8 个质因子,其他质数的处理都只需保留 x

所以我们只需保留 9 个数。求 gcd 就只需要 291 次操作。

回到题目给出的式子,它是等于 (gcdai)2i=1ngcdaj(i!=j)gcdai 的。

gcdaj(i!=j)gcdai>1i 也只有 9 个。

这个题就做完了。令 m=9 ,操作数是 O(m2m) 级别的。

十二. ARC153F Tri-Colored Paths

题意:给一个简单无向图三染色,使得存在一条简单路径包含了三种颜色,求方案数。3n,m2105

做法:

n<5 dfs 解决,下面令 n5

我们先进行一步容斥:整个图至少有三种颜色,不存在包含三种颜色的简单路径的方案数。

我们考察一个环的染色情况。

  1. 环上有三种颜色。

case1: 长度 4 ,则一定存在一种颜色出现两次,割掉其中一条,存在了不合法路径。

case2: 三元环。

如果三元环上存在两个点 u,v ,以及环外的 x1,x2 ,满足 ux1 间有边, vx2 间有边,且 ux1,vx2

这个时候一定不合法的,读者可以自己画画看。

如果三元环上有至少两个点和环外的点有边,那一定会出现上面的情况(注意 n5)。

所以只能有一个点连接外面的边。可以发现外面的边都被染成了一种颜色。而且这个时候三元环一定是点双。

找出这样的三元环个数 C ,则有方案 6C

-----下面的情况中,只要有环有三种颜色,就视为不合法,这样能更方便。

  1. 环上有两种颜色,不妨令之为颜色 1,2 。则环外一定有一个颜色为 3 的边。

若这个边两个端点都在环内:一定不合法,读者自证不难。

否则,也一定不合法,读者自证不难。

------下面的情况中,所有环都只能有一种颜色。

  1. 此时,所有点双内的颜色都是相同的。我们把圆方树建出来。

一定存在一个圆点,与它相连的方点有至少两种颜色。经过一些推导(读者自推不难),发现删掉它之后,每个联通块内的方点颜色相同。

由此可以证明,只会存在一个圆点满足上面这个条件。

所以直接算就好啦。

复杂度 O(n+m)

十三.ARC155E Split and Square

神神神。

题意:你有一个初始集合 S,然后你每次操作可以把 S 分成两个集合 T1T2 。令 f(T) 表示 {ij|iT,jT} ,则 S=f(T1)f(T2) ,把 S 变为 S

求最小操作数,使得 S 变成 {0}

题解:

考虑一次操作后线性基大小的变化。令 S 中的数线性基为 e1,e2,,en (这些数都出现在 S 中), T1 中包含 e1,e2,,emT2 中包含 em+1,em+2,,en

e1e2,e1e3,,e1em,em+1em+2,,em+1en ,这些数一定是无法被互相表示的。所以大小至少为 n2

另一方面,我们有这样的构造:把 S 中每个数都表示成,e1en 中的数的一个子集。如果含有 e1 ,则分到 T1 ,否则分到 T2 ,显然此时线性基大小至多为 n1

考虑什么时候大小为 n2 。通过 e1e2,e1e3,,e1em,em+1em+2,,em+1en 这些数,我们可以得到所有满足:

e1,e2,...,em 中选了偶数个,em+1,em+2,,en 中选了偶数个表示出来的数。我们不能使 S 含有其他数。

则分进 T1 的数必须满足:e1,e2,...,em 中选了奇数个,em+1,em+2,,en 中选了偶数个。T2 同理。

所以,一个数能分进 T1T2 ,当且仅当它在 e1en 中选了奇数个。

综上,经过一次操作后线性基大小减少 2 ,当且仅当:S 中所有数都能用奇数个线性基里的数表示出来。

但是,经过至少一次操作后的 S 含有 0 ,所以一定无法减少 2 。我们只需要判断初始的 S 是否满足条件即可。

复杂度是求线性基的复杂度: O(nm2/w) ,其中 m 表示 S 中的数值域在 [0,2m) 之间。

posted @   grass8woc  阅读(295)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示