3nd ucup 部分题目记录

退役之后一直想着,我至少还是更新一下 ucup 好题和互测好题,但很遗憾一直摆到了现在;论文也还没有开始施工。

我一直觉得自己如果改掉不良的生活习惯,提高自己的学习效率,完全可以达到更高的水平,但很遗憾我确实战胜不了自己,我或许永远都看不到自己的上限了。

马上就 NOIP/CTT 了。我觉得我起码得象征性的训练一下。我仔细想了想,我还有一个上 LGM 的梦;我是 ucup 队里最菜的人,我不想继续次次在后期摆烂。

那趁我清醒,开始写点东西吧。

先写下没打但是想做的:stage4,stage8

2J. Polygon II

n 个在 [0,2ai] 随机的实数,求它们能围成多边形的概率。n1000

算不合法的概率,那就是枚举最大的边 p,要求 x2xp 。改变一下 xp 的定义,重新令其为 2apxp ,这样就得到 x2ap 了。

接下来是关键的一步: 由于我们只关心 x 和一个整数的大小关系,那其实可以把 x 拆成整数部分和小数部分。也就是如果指定 x 的整数部分,令 A=2ap[x] ,那合法的概率其实就是 n[0,1] 间随机的实数加起来 A 的概率,这可以容斥计算。

问题转化成:计算 A0,A1,A2,,An 的概率。

现在 [xi][0,2ai) 随机的整数,发现我们可以进一步拆解:可以看成二进制下每一位都有 12 的概率为 1 。最后的计算就是数位 dp 状物了,从低到高 dp ,记录下当前 x 和限制的大小关系,以及往后的进位。复杂度大概是 O(n4logV)

怎么优化呢,由于我们最后只需要计算 eiP(i+[x]2ap) 状物,我们在 dp 的时候只需要在最低位先垫上 i+1 ,最后看第 ap 位有没有进位即可,于是也不需要记与限制的大小关系,答案就是 dpap,0 ;又可以发现并不需要枚举 p ,所以复杂度降为 O(n2logV)

2L. Chords

一个环上 2n 个点连了 n 条边,要取出尽量的边满足两两不交,数据随机。

n105

先编出来 O(n2) 的 dp ,就是设 dpi,j[i,j] 内能取多少线段。发现由于数据随机,答案是 O(n) 级别的,于是经典的交换状态和值域,设 pj,k 是令 dpi,jk 的最大的 i ,发现 p 也是好算的,复杂度 O(nn)

2I. Mercenaries

n 个点, ii+1 的边上有若干物品,物品有属性 (x,y) ;点 i 上也有一件物品。现在有若干询问 R,a,b,c ,你想求出最大的 L 使得:能从点 L 到点 R ,使得取出点 L 的物品,再在路上每条取一件物品,能使得 a(x)+b(y)c

n,q2105 ,物品总个数 S5105

可以发现这个问题一看就很凸包。

建出线段树,设 Gp 是节点 p 内每条边取一个物品得到的 (x,y) 形成的上凸包;Fp 是节点 p 内取一个点为起点,走到右端点的 (x,y) 构成的凸包。令 Mmidmid+1 的物品构成的凸包,发现 Gp=GlGrMFp=FlGrM+Fr ,其中 是闵可夫斯基和,+ 是求两个点集并起来形成的凸包。查询在线段树上二分即可。

发现每次询问要对 O(logn) 个凸包求出,取一个点 (x,y) 使 ax+by 最大。考虑把询问离线下来,把 (a,b) 按极角排序,然后只用对每个凸包维护一个指针即可。复杂度 O((n+q+S)logn)

3K. Knocker

这场开始和两个超级传奇大师做队友。

给你一个序列,一次操作能整体模一个数,问最后能得到多少不同的序列。n500

(记录官方题解)先来分析终止状态 b 合法的条件。不妨对 a 从大到小排序并去掉相同的位置,接下来观察 b1 ,现在不妨设 k=b1a1 ,我们有结论:对于 aikbi 一定等于 aik

只需要证明一步操作后这个条件成立,然后归纳即可。不妨设模 x 后得到的分别是 a1ai ,那首先有 a1a1kai ,于是 aiaia1a1 。另一方面由于 aiai=x[aix] 。所以 a1a1aiai 。就发现 a1a1=aiai 了。

回到问题,这里还有一个条件:ai<2k ,一步有效操作后 a1 一定会减半。发现这之后直接取模数为 k ,即可让 aik 的数都变成 bi 了;这也是最优的方法,因为取更小的数后效性更大,取更大的不合法。你发现这样就不会影响 ai<k 的那些数,于是此时递归到了一个子问题!只不过我们为了不再影响已经固定了的这些数,会要求之后每次取的模数 >b1

于是设 dpi,j 表示只使用 j 的模数能得到的不同 bibn 个数,转移枚举 k 即可。复杂度 O(n3)

3B. Breaking Bad

给你一个 nn 的矩阵,对于 k=0,1,,4 ,问是否存在排列 p 使得 (Ai,pi)mod5=kn1000

首先可以想到随机赋权算行列式,可惜过不了。

(记录官方题解)

观察到大多数情况下每个 k 都是有解的。考虑如果有一个排列满足能取出不交的四对数 (i,j) ,都满足 ai,pi+aj,pjai,pj+aj,pi (模 5 意义下)那就可以通过交换/不交换 i,j ,对排列进行调整,不难发现一定能调整出所有可能的余数。

(其实有一个数学上的结论是,对于 k 个模 p0 的数 (k<p) ,它们不同的子集和一定有至少 k+1 个。)

接下来先找到任意一对这样的 (i,pi),(j,pj) 。事实上去尝试 (i,j),(i+1,j+1) 就好了,反证易得。如果找不到的话也不难说明此时排列怎么取,结果都是一样的:一定存在序列 R,C 使得 ai,j=Ri+Cj

接下来直接把 i,i+1 行和 j,j+1 列删掉,继续找下去,如果最终找到了四对我们就 win 了。否则看一下发生了什么,设此时找到了 q 对,发现我们其实就得到一个 (n2q)(n2q) 的子矩阵,满足 ai,j=Ri+Cj 。不妨设 q=3 ,把特殊的 66 列提到最前面。接下来直接状压 dp:

dpi,S,h 表示考虑到第 i 行,关键列取了 S 且当前和为 h 是否可能。注意这里算和的时候,我们先把和当成 R+C ,每次取了一个特殊的格子后就把对应的 R,C 减去,再把实际值加上即可。复杂度即为 O(4mn) ,本题中 m=5

感觉这场这两个题都不在我脑洞范围内啊,大概想一想,K 是找到了判定过程中的子问题,从而设计 dp;B 是观察到了难搞的情况形式很好看,于是也不难搞了。

5J. Prefix Divisible by Suffix

问你 n 以内有多少数满足:把十进制写出来,能够把它划分成两段 p,q ,使得 q+c|p ,其中 c 是给定常数。n1014,c104

发现自己其实一眼就会了,只是不敢剪枝。考虑直接枚举最低的 7 位,发现此时我们对 n 提出来若干限制 (p,c) 表示:若模 p 余数为 c 就一定合法了。对这些限制容斥,这样就得到了一个算量 207logV 的做法。(需要解 CRT)

但自己想想,算量真的会那么大吗?可以发现指定容斥的集合,其模数的 lcm 很有可能很大,于是容斥的时候直接搜索要钦定的集合,lcm 太大了就剪掉。然后就能通过了。。挺没意思的。

5C. Painting Fences

给你一个网格,给出每个格子开始的颜色(黑/白),一次操作可以选一条与 x/y 轴平行的直线对网格翻折,对于重合的两个格子,如果一个为黑的话可以把另一个也染黑。求出使得所有格子变黑的最小次数。n1000

倒着来看这个过程,于是发现起作用的其实只是一个全黑的子矩形,设 fl,r 是假设这个矩阵是 1n 的,且 [l,r] 为黑那需要操作多少次,gl,r 同理为矩阵长为 m 时的次数。则可以发现一个子矩阵需要的操作数就是 fxl,xr+gyl,yr

枚举 xl,yl 。一个一开始就能做出的观察是答案很小,具体的发现:fl,r 的大小都是 O(logn) 级别的,所以求出 pl,i 表示最小的 r 使得 fl,riql,i 同理。于是只需要枚举 xr=pxl,i,yr=qxr,j 看看是否合法即可。这里可以双指针,复杂度 O(n2logn)

7E. Express Eviction

给你一个 nm 的网格图。有一些格子存在障碍,障碍可以 ban 掉它周围的四个顶点。现在你想知道:至少要移除多少障碍,才能从 (0,0) 走到 (n,m)

先想想如果已经知道哪些点被 ban 了该怎么判断,发现其实就是,如果存在 x=0/y=m 的点与 x=n/y=0 可以通过 ban 掉的点八联通起来,那就寄掉了。

进一步可以发现,确定障碍后寄掉的条件其实就是: x=1/y=m 的某个障碍可以走到 x=n/y=1 的障碍,其中每一步只能走到 x,y 之差都不超过 2 的障碍,证明比较容易。

对着这个做最小割就好了。

7C. Price Combo

很牛的一个题,先咕了。

10H. Intersection of Paths

给定一棵有边权的树,询问:临时修改一条边的边权,然后给定 k ,求出取 k 条端点不重合的路径,交的边权和的最大值。n,q5105

取重心为根,发现如果存在一组方案的交会包含 uv 的路径,就等价于 szu,szvk ,于是如果没有修改边权的事情,我们就只用求出 szk 的点中距离最远的两个点。

现在有边权修改,怎么处理,我们其实只需要求出删掉这条修改的边后,两个子树分别的直径即可。注意到这个直径的端点要么是叶子,要么是删掉的边的端点,那我们考虑把 k 相同的询问放到一起处理,将保留 szk 的点后得到的树的叶子拎出来,容易发现它们只会有 nk 个,每次询问相当于查一段区间的点的直径,线段树处理就可以平衡。复杂度 O((n+q)logn)

冷静一下,其实这样处理烦了,我们把询问按 k 从大到小排序,这样只需要维护线段树,要求每次激活一个点,以及查询一个区间激活的点的直径即可。复杂度仍是 O((n+q)logn)

LOJ177 生成子群阶数

给你 m 个长度为 n 的排列,问你它们能复合出多少不同的置换,其中每个排列都能用若干次。n,m50

发现还不会这个东西,学一下。

首先可以把给定排列的逆也加进来,因为设其环长 lcm 为 L ,其实逆就可以表示成原来的排列复合 L1 次。

考虑建出一张图,对于一个给定的排列,对任意 1in ,我们从 i 连向 pi ,这样一组操作可以看做是从 1 开始的一条路径,途中会复合上所有经过的置换。可以发现这里走到的点就代表当前 p1 的值。

现在先求出以 1 为根的生成树,设终点为 t ,那对于 1t 的任意一条路径,考虑在走到 t 之后,沿着树边走回 1 ,再走到 t ,可以发现这样效果是不变的,于是终点为 t 的路径一定都形如:从 1 出发走回了 1 ,再按照树边走向 t

就可以得到一个结论,方案等于:p1 可能的取值数 ,乘上 p1=1 的方案数。

继续思考对于一条走回 1 的路径 1u1u2uk1 ,它和 1u11u1u21u2u31uk1 是等价的。其中 是在走树边。

于是得到结论:p1=1 的排列都可以通过将 1uv1 得到的排列复合得到。

这样做的好处是,我们可以用的置换都满足 p1=1 ,于是可以递归到 n1 的子问题继续做。但问题是我们建出的图有 nm 条边,也就是说子问题里 m:=nm,n:=n1 ,这显然就炸掉了。结论是,我们只需要把这 nm 个置换先改造成 O(n) 个,改造的方法是,我们进行随机,在这些置换中随机选择一个子集,将内部的置换复合起来,这样随 O(n) 次,把每次随机得到的置换给递归下去。

复杂度 O(n5) ,瓶颈在于要做 O(n2) 次随机复合的过程 ,每次期望会复合 O(n2) 个排列,单次复合是 O(n) 的。

11J Again Permutation Problem

只需要把 LOJ177 的答案和 LOJ4127 的答案乘起来就好了。

回顾一下 LOJ4127 的做法,其实发现这里分析的方法是类似的,我们仍然先把排列的逆加进来,然后建立一张 n2 个点的图,对于一个给定排列我们在点 (i,j) 和点 (pi,pj) 间连边。这样有结论是:若 (i,j),(a,b) 联通则 pi=a,pj=b 的方案数等于 pi=i,pj=j 的方案数。证明是和上面那个题的证明基本一致的。

于是算逆序对的期望只需要枚举 i<j ,记与 (i,j) 联通的满足 a<b 的点数为 xa>b 的点数为 y ,那贡献其实就是 yx+y 了。更直接的,就是对每个联通块计算 xyx+y 的和。

11F Train Seats

题意是有一些椅子,每次可以拿走一个椅子,代价是离它最近的两把椅子的坐标差(若左边没有则为 0 ,右边没有则为 m+1) 。让代价的和最大。n2105

a 排序,设 bi=ai+1ai (令 an+1=m+1),则一次操作相当于合并 bi,bi+1 ,代价为 bi+bi+1 ,最后让代价最大。建一棵二叉树来刻画这个过程,然后我们有结论:不可能有一个点的两个儿子都是非叶子。证明就考虑四个数 x,y,z,w ,我们相当于要证明:先合并 (x,y),(z,w) ,再合并 (x+y,z+w) 一定不优。原因考虑此时代价是 2(x+y+z+w) ,而从左往右依次合并的代价是 3x+3y+2z+w , 从右往左是 x+2y+3z+3w 。把都有的东西减掉,发现 max(2x+y,z+2w)2x+2w+y+z2x+w

那其实就可以看到我们只有两种可能:要么合并好 [2,n] 再把 1 合并进来,或者合并好 [1,n1] 再把 n 合并进来。也就是说,每次会删掉 b 的开头/结尾,代价是当前剩余的长度乘上选择的数。

直接使用 qoj2070 的代码即可。大概思路就是枚举最后保留的位置 k ,那就是对一棵只有两条链的树做 exchange argument,利用线段树来合并两侧已经出现的连续段即可。

11O New School Term

差点把我们队逮捕了的题。

题意是有一个 2n 个点的无向图,你需要选择一个边集,使得能黑白染色且 白点个数=黑点个数 的前提下,使选择的边的 2 最大。

n5000,m106

从大到小尝试加入每条边,先看一下加入后怎么判断合法。

用拓展并查集判能不能黑白染色:如果 uv 在一个联通块就寄了;如果 uv+2n 已经在一个联通块,那不会影响,直接加进来即可。

否则我们连上这条边来尝试,发现其实对每个联通块求出黑-白之后做一个背包就好了。

这里我们任意设立一个模数变成算方案,这样的好处是可以支持删除物品。

接下来更新并查集,如果可以连的话,自然就合并 (u,v+2n),(v,u+2n) ;否则你发现 u,v 一定同色,于是合并 (u,v),(u+2n,v+2n)

这样每次做尝试都会让联通块个数减少,于是复杂度 O(n2+m)

11N Product Matrix

题意是定义 P(x) 是一个 nn 的矩阵满足:P(x)i,j=ai,jx+bi,j

现在需要求出 (i=0m1P(2ix))1,1 这个多项式每一项的系数。n6,m5105

尝试直接插值。

求出 x=20,21,,2m 时这个式子的值,设 x=2i 时答案为 ci ,那我们的多项式就长成 ciijx2j2i2j

现在分为两步,第一步是怎么算 c ,第二步是怎么算最后这个多项式。先来看第一步,令 Ai=P(2ix) ,则 ci 就是把 AiAi+m1 乘起来之后 (1,1) 处的值,于是只需要求出 Bi=j=imAj,Ci=j=m+1iAj ,则 ci=(BiCi+m1)1,1 ,复杂度 O(n3m)

再来看第二步,我们固然能直接 O(mlog2m) 求出来,但这个太慢了过不了。

先把式子写成 ciij(x2j)=(x2i)cix2i

(x2i) 可以分治:考虑得到 i=0m1(x2i) 后怎么求出 i=m2m1(x2i) ,记前者第 i 项系数是 ai ,则后者第 i 项的系数就是 ai2(mi)m 。复杂度 O(mlogm)

cix2i=ici2ijxj2ij ,于是第 j 项系数就是 ici2i+ij 。利用 chirp-z 处理 2ij 即可,复杂度 O(mlogm)

这题最难的一步是第一步,想到直接插而不是干别的事情。

13G Count Pseudo-Palindromes

题意是给你一个序列满足每种数出现恰好两次,然后对序列的每个位置,询问有多少个包含它的区间是合法的。合法的定义是:出现一次的数有恰好一个。n5105

抛开异或哈希的思路,我们直接考虑设 Al,r 表示 [l,r] 内出现一次的颜色,发现颜色对 A 的贡献就是把两个矩阵加 1 ,而查询就是查 A 的某个子矩阵里有多少 1A 矩阵最小的值是 0 ,如果是 1 就好做了,考虑合法的区间一定满足 l,r 奇偶相同,且这样的 Al,r>0 ,于是枚举 0k<2 ,维护矩阵 A 满足 Al,r=A2l+k,2r+k 即可。扫描线做完,复杂度 O(nlogn)

13A 012 Grid

题意是问你有多少填充 nm 的矩阵的方案,使得每个数是 0/1/2,且 Ax,yAx,y[0,1] ,其中 xx[0,1],yy[0,1]

n,m2105

把 0,1 的分界线,1,2 的分界线画出来,思考怎么样的分界线能使方案合法。先把全 0/全 2 的情况判掉,接下来可以看见两条线一定形如:从右下角开始重合走一段然后分开,再次重合后就不会分开,一起走到左上角。并且为了保证 02 不连通,这重合的一段只能是一条线段,否则就寄了。枚举重合的部分后中间的方案容易用 LGV 算,最后对着这个式子优化,发现可以写成卷积的形式,复杂度 O(nlogn)

14D A Simple String Problem

题意是给你一个 2n 的字符矩阵,取一条起点终点任意,只能往右往下的路径使得:把经过的字符串起来是 AA 串。求出最长的长度。n5105

考虑把第二个串往后平移一位。接下来使用 优秀的拆分 trick ,画画图发现求几个 lcp 就做完了。

14I A Brand New Geometric Problem

给你一堆正整数,一次操作可以删掉一个数/加入一个正整数,需要通过最少的操作使得:它们的和与积等于给定的两个数。n105 值域 1010

一个暴力的思路是搜索积的拆分,考虑怎么优化。

设立块长 B ,我们搜索拆出的 >B 的数,B 的数直接 dp 。这样就做完了。

14H Subsequence Counting

转化后题意是求 i=0L1AikmodL ,其中 gcd(k,L)=1A 以若干连续段的形式给出,连续段个数 2000 ,每个 Ai 是大小 10 的矩阵,L109

观察 (ik)modn 变化的过程,考虑求出 Bi=i0,i+tk<LAi+tk ,可以发现 B 的连续段个数与 A 基本相同,我们可以通过线段树处理出 B 的连续段。发现 i=0L1AikmodL=i=0k1Bi(kLmodk)modk 。于是我们递归到了一个子问题:从 (k,L,A) 递归到 (kLmodk,k,B)

可以发现如果每次 kL2 ,我们就能保证递归层数是 logL 的。但看起来这里并不是,怎么办呢。考虑 k>L2 时,我们可以直接把 A reverse (A0 不动),这样 k:=Lk ,就满足 kL2 了。

于是 k>L2 时递归到 (Lk,L,rev(A)) 即可。复杂度 O(nm3lognlogL)

15H Friendship is Magic

题意是设 f(x) 是把 x 在十进制下划分成两段,二者之差的最小值。多次询问,求 f 的一个区间和。T1000,N1018

考虑直接枚举使差最小的分界线,如果前面的部分是 x ,后面的部分除了第一个数字是 y ,第一个数字是 a ,后面的部分长度为 w

不妨设前面的数更小,那么限制即形如:010wa+yx10x+ay 。当然还有对 x,y 的限制,我们可以拆成 x 顶满/没顶满的情况,最终都可以写成 0xN,0yM 的形式。可以发现确定 xy 的上下界都是分段的一次函数,而我们关心这一段中 y 的和,那么这是分段的二次函数。想办法计算即可。

17L The Tower

维护一个初始全 0 的序列,有三个操作,第一个是给定 k ,把前 k0 都赋成一个新的值;第二个是把所有等于某个值的数赋成 0 ;第三个就是单点查。操作次数 5105

考虑离线下来,然后转化观察的角度,我们从左往右考虑序列的位置,在每一刻的值。再来观察我们的操作,发现其实等同于:有若干条从 i 连向 fai 的边,边有边权,对于每个位置,我们会从 1 出发,如果当前的点到 fai 边权 >0 就跳到 fai ,边权减 1,且可以得到这个位置在 [i,fai) 这些时刻的值都是 i 对应的颜色;否则会跳到 i+1

发现可以用 LCT 来维护,如果边权减成 0 了就把这条边断掉连上 (i,i+1) ,我们不断提取出 1 到根的链,算出其上边权最小者,进行断边连边以及查询即可。复杂度 O(nlogn)

18B NonZero PrefSuf Sums

定义一个序列是合法的当且仅当对其重排后,所有前缀和&所有后缀和都不是 0

给你一个序列,问有多少子序列是合法的。 n100,|ai|100

不断的找充要条件。不妨令正数的和>负数的和。

  1. 如果存在两个不同的正数就 win 了,可以把负数排前面,正数从小到大排后面,如果此时寄了的话,把最小值移到这个寄的前缀的最后面,再和最大值交换即可。

  2. 剩下正数全部相同的情况,不妨令它们是 k 。如果存在负数不是 k 的倍数就 win 了,还是可以把负数排前面,正数排后面。

  3. 剩下所有数都是 k 的倍数的情况,不妨都除掉 k 来观察。我们需要前缀和数组中不能有 0S ,其中 S 是所有数的和。其实可以发现由于现在正数只有 1,所以若存在 S ,就一定有过 S ;又因为终点 S>0 ,所以有 0 就一定有 0 。此时如果有一个负数的绝对值 S1 就铁定爆了,否则设负数分别为 a1,a2,,am ,只需要先加 a1+11 再减掉 a1 ,加 a21 再减掉 a2 ... 这样子,你会发现此时 1 肯定是有剩余的,所以就 win 了 。

于是不合法的条件即:正数全部为 k ,负数全部为 k 的倍数, minSk

对着这个计数就好了。 n 很小所以复杂度是多项式的就行了。

18I Donkey, Keep Watch

给你一个序列,问有多少子序列 and+xor=or。ai1.5104,n106
n=14,V=214 。直接枚举全 0 的数位 x 和全 1 的数位 y ,这里不妨设 y>0 ,发现只需要选的数异或起来是 V1x 即可,算出来这些满足条件的数的线性基,进而就能算出方案数了。发现 (x,y) 时的线性基可以通过 (x+2p,y)(x,y+2p) 并起来得到,其中 pxy 。这里复杂度就是 O(3nn2) 的了。再考虑 y=0 ,只需要容斥几下就能得到答案了。

18M Enchanted Lawns Quest

给你一棵有边权的树,你需要让这些边的边权增加,增加的总量要等于一个定值。最后要让直径最小。

考虑二分直径。一开始的想法是做一些从下往上的 dp ,发现 mid2 的部分好处理一点, >mid2 就很麻烦了。这个时候就想到,为什么不去枚举直径的中点呢。假如说中点一定在一个点上,我们只需要枚举这个点 x ,我们让修改之后所有点距离它 mid2 就好了。那现在中点在边上,我也可以枚举这条边。设这条边是 (u,v,w)Au 那侧离 u 最远的距离,Bv 那侧离 v 最远的距离,我们让 A,Bmid2,A+Bmidw 就好了。

先想想确定了 A,B 怎么计算能添加的最多边权。以 A 这边为例,发现最远的只会是叶子,于是设叶子个数是 s1 ,它们距 u 总和是 s2 ,那这个就是 s1As2 。 当然也对 A 提出了一个下界。现在 A,B 都从下界开始上下调整,不妨设 A 它对应的 s1B 大一点,那肯定会先去调 A 。这个题就做完了。

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