SS25winter

Day 0 - 数学

A - 洛谷 P2522

简单莫比乌斯反演。

B - QOJ9866

不难发现,由于我们只有 n1 个变量,所以我们只需要 n1 个异或方程就能确定所有权值。同时,这个求解的过程可以用高斯消元。

首先,我们有一个暴力的做法:直接枚举所有可能的询问,然后判断能否通过这个询问表示 n1 个变量。

接下来考虑用贪心优化。每次我们找到一组距离为 k 的点对后,我们都要检测这个点对的方程是否有用。

根据我们的常识可知,一个点对导出的异或方程有用,当且仅当这个方程不能由前面的方程推出来。用严谨的语言来说,就是这个异或方程和前面的方程线性无关。

因此,我们考虑维护前面所有方程的线性基。最后用高斯消元即可。

C - GYM105423D

直接莫比乌斯反演即可,公式很好推。

附公式:

ans=2i=1nj=1i1T|bi,T|bj(aibibjbiajbj)d|Tμ(d)d2T2

这个公式的计算是 O(nd(maxbi)) 的,可以通过,其中 d(x) 表示 x 的因数。

D - CF2039C2

首先考虑计算 xxy 的方案数。

一个比较常见的 trick 是,xy 的值肯定是若干区间的并。因此,我们可以利用这个性质快速算出上面的值。

接下来计算 yxy 的方案数。

乍一看貌似不可做,因为二进制中的整除难以刻画。因此,我们重新观察题目,发现 x107 的条件还没有用。

因此考虑分析满足上面的方程的 y 的上界。不难发现,当 y 超过 k×xk 为常数)的时候,y 会大于 12(xy)。而 y 不会等于 xy,因此不存在满足条件的 y

也就是说,我们只需要枚举 O(x)y 即可。注意在计算的时候不要多算同时满足 xxyyxy 的情况。

E - QOJ9868

突破口是 n5000。这个数据范围启发我们想 O(n2) 算法,比如 DP。

接下来你就会发现你被骗了,因为即使是样例,输出也很小。

考虑证明这个东西。最不利的情况时,abgcd1。而此时,我们只需要操作 ab 各一次,就可以让 gcd2

同样的,最不利时 abgcd2。我们仍然只需要操作 ab 各一次,就可以让 gcd4

这样,我们总共不会操作超过 2log(min(n,m)) 次,约为 24。所以直接广搜即可。

F - CF2006C

首先,为了判断一个区间能否被表示,我们分析一下题目中的操作。

首先举一个例子。比如说 {6,12,24} 最后就会变为 {6,9,12,15,18,21,24},是一个等差序列。证明可以考虑一对相邻的公差 d1,d2 不相等的结果。

接下来考虑什么情况会让公差为 1。可以发现,我们前面的操作首先会取原来相邻两数的差的 gcd,然后将这个值不断除以 2。也就是说,当一段区间相邻两项的差的 gcd2k0 时,这个区间就是满足条件的情况。

代码实现可以考虑对于上面的两种情况分类,都用 st 表 + 二分解决。

H - QOJ1168

线性基性质题。

前置知识:

线性变换

用不严谨的语言来说,对于在域 F 上的线性空间 V 来说,线性变换 F:VV(定义域为 V,值域为 V)需要满足以下限制:

x,yV,m,nF,有 F(mx+ny)=mF(x)+nF(y)

记所有环的异或和的集合为 S,同时令 S1={a1a2ak{a1,a2,,ak}S}uv 的最大 xor 路径为 d(u,v)uv 的任意一条路径为 d(u,v),同时,为了方便,我们记任意一个集合 QwQ 中的最大值为 max(QwQ)

性质 1:d(u,v)=max({d(u,v)xxS1})

证明比较显然,略过。

性质 2:xV,max({xxxS1})=max(S1)min({xxxS1})

证明可以考虑如何求出左式和右式。

我们需要求出 S1 的一组线性基,再对这个矩阵标准化。记这个矩阵为 QwQ

max(S1)=xQwQxmax({xxxS1})=xQwQ[x&x=0]xmin({xxxS1})=xQwQ[x&x0]x。剩下的证明显然。

性质 3:变换 F:vmin({vxxS1}) 是线性变换。

套用定义。这个东西等价于证明 x,yS1,有 F(xy)=F(x)F(y)

证明类似上面。

最后的最后,开始推式子。

sijtd(i,j)=sijtmax({d(i,j)xxS1})=sijtmax(S1)min({d(i,j)xxS1})=sijtmax(S1)F(d(i,j))=[(ts+12)mod2=1]max(S1)F(sijtd(i,j))

K - QOJ9623

考虑一个 au 什么时候能够对答案产生贡献。

分情况讨论。

  1. du=0:由题意,此时肯定只有一个点,可以对答案产生贡献。
  2. du=1:这个点只能成为合并时 x,y,z 中的 xz,也就是说,这种情况中的 au 次大值可以对答案贡献。
  3. du2:这个点可以成灰合并时 x,y,z 中的 y,即 au 可以对答案产生贡献。

上面我们得到了答案的理论上限,接下来考虑取到这个上限。令最后产生贡献的时 ax,则我们将 x 放到最后合并,即可取到理论上界。

L - QOJ9622

考虑 ab+cd 什么时候能是有限小数。前面的式子显然是 ad+bcbd,只要约分后的分母仅有因子 2,5 就是有限小数。

g=gcd(b,d) 去掉因子 2,5 的数,b=bgd=dg。则原式又可以化为 ad+bcbdg。此时,我们只需要约掉 g,就可以满足题目的条件。

接下来,由于前面的定义,d 只能含有因子 2,5(证明:如果有其它约不掉的因子,则这个因子肯定最后约不掉,这里不展开讲述),也就是说 d 的个数不是很多。因此,我们可以枚举 d

接下来,我们唯一不确定的变量就是 c 了。由于我们必须约掉 g,所以 gad+bc,可以用 exgcd 解决。

Day 1 - 记数

B - 洛谷 P11363

容斥做法没咋懂,用了另一种做法。

对于 k=1,考虑最终树的形态,有答案等于 (di1)!

对于 k>1 还是考虑树的形态。用上面的方法会记重复很多,可以考虑容斥,但是这里不讲。

为了绕过容斥,我们考虑怎样的一棵遍历树可以被表示。

对于一棵遍历树,我们发现它的起始边只能是一条叶子到叶子的链。证明考虑一个点周围的边如何满足条件。

最后 DP 即可。

E - QOJ9778

首先,当 k200 的时候,有一个朴素的 O(nk) DP。

接下来考虑 np20 的性质。注意到如下性质:

  • 这个条件告诉我们,失败的概率很小。
  • 再加上 k 较大,也就是说我们几乎不可能用完所有道具。
  • 题目罕见地让我们输出了小数,说明我们并不需要精确的期望。

也就是说,我们在这种情况中,通关的期望次数是 n11p 的。因此,直接输出这个数即可。

F - QOJ7662

简单容斥。

H - 洛古 P3757

首先不难往树形 DP 去想。

dpu,i 为以 u 为根的子树中,i 个数比 au 要大的方案数。

转移不难。

J - GYM105459E

由于总共只有 O(mn) 种到达的时间,所以可以考虑找到每个数作为中位数的期望。

对于每种时间,每个弹珠都有一定的概率大于它。我们需要找到有恰好 m2 个大于它的概率。

这个东西可以用 DP 做到 O(m2n2),过不去。

但是,我们发现相邻两个时间中的概率差异不大,且这个差异是 O(mn) 的,所以考虑类似退背包修改即可。

Day 2 - DP

A - GYM105336I

转化:i=1i×[ans=i]=i=1[ansi]

运用上面转化的原因是 [ansi][ans=i] 更好统计。

那么我们枚举 i,计算 [ansi] 的方案数。

a,b 排序后,不难发现每个人拿的行李的区间一定是 [1,fi],且 fi 单调不降。

接下来就很好 DP 了。令 dpi,j 为前 i 个人拿了 j 个行李的方案数,则 dpi,j=dpi1,j+dpi1,j1×(fi(j1))。这个式子的组合意义就是考虑 i 是否拿行李。如果拿行李,那么我们就需要在 fi(j1) 个行李中任意找一个,正确性有 fi 可得。

F - CF2048F

首先考虑最优决策。

对于 b 中最小值固定的情况,我们肯定希望区间越长越好,所以考虑笛卡尔树。

接下来,由于我们是除法操作,所以次数是 O(logai) 的。

接下来不难想到 DP:令 dpx,y 表示以 x 为根的笛卡尔树中,操作 y 次后 a 中的最大值最小。

直接 DP 可以做到 O(nlog2ai),用归并可以少一个 log

G - CF2002F1

Write anything and pray that it will pass because of number theory magic.

乱搞万岁!!!

首先发现,我们可以走到 (i,p),i<p,pprime 的位置。证明显然。

性质一:np 不会太大。

乱搞:令 i=p200,并从这个 (i,p) 开始 DP即可。

J - CF2020E

x=i=02iai,则 x2=i=0j=02i+jaiaj

所以 E(x2)=E(i=0j=02i+jaiaj)=i=0j=0E(aiaj)2i+j

E(aiaj) 可以用 O(nlog2ai) 的 DP 算出。

Day 3 - 数据结构

B - QOJ9774

考虑如何判断一个区间 [l,r] 能分成 rl+12 对和相同的整数对。

首先,我们需要排序 [l,r]。而这个东西并不是正常的数据结构可以维护的。

  • trick:利用生成函数处理排序。

fl,r=i=lrxai,gl,r=i=lrxai

则询问为 yes 的充要条件为 gl,r×xmax(alar)+min(alar)=fl,r。这个东西显然可以哈希 + 线段树做。

F - 洛谷 P11527

bi=gcd(i,ai)。根据直觉,bi 的修改次数不会太多。可以分析出来,修改次数是 O(nloglogn) 的。

接下来直接分块即可。

Q:如何确定 bi 是否会被修改?

A:对于每个质数 p 维护 {i(pibi)} 的集合即可。

G - QOJ9409

将红色记为 1,蓝色记为 0。考虑将 10 答案的影响。

例如,10001001010001 -> 10001000010001

不难发现,影响答案的 (l,r) 均满足 l[l1,l2],r[r1,r2]

建立平面直角坐标系,发现这就是一个矩形。接下来有两种做法:

  • std:线段树合并,维护连续的蓝色段。
  • 我的做法:树套树,不过为了减少常数,内层是前缀和。

I - QOJ9738

“存在”这个条件不好刻画,所以我们需要尽量对于每个区间都找到一个固定的 d

显然,我们需要让最小值成为题目中的 d。而对于最小值位置固定的若干个区间,如果最大的区间满足条件,则其余区间均满足条件。

接下来可以考虑类似分治的结构。如果 [1,n] 的最小值位置为 x,则对于区间 [l,r],1lr<x,我们需要往下递归。

这个结构其实就是笛卡尔树。继续手玩可以发现,我们让树上的每条边都满足 afax+tax+t 即可。

接下来,可以推出 afax+taxafax,也就是说 t 的个数不会很多,可以暴力枚举 + 检查。

J - QOJ9727

首先拆位。

接下来有比较显然的 O(nlognlogai) 做法。老师说过不去,然而我坚信常数小一点是可以过的,但是没有实际测试过。

发现我们的瓶颈在于存储一个长度为 logai 的位置数组。但显然这个是没有必要的,我们只需要存储值,位置可以通过线段树上 DFS 来找到。

具体来说,对于每一位,我们都维护两个 bool 变量,分别表示这个区间是否全为一以及这个区间是否只有一个零。

然后不难想到把这些信息压成一个数,然后就做完了。

注意 pushdown 的特殊情况。

Day 4 - 图论&构造

A - GYM102896A

不难想到利用贪心递归填数。

无解的情况是递归到某棵子树时 a=0bmod2=0

B - GYM102896C

这种题一般分为两部分:理论上界+可以取得到上界。

首先,理论上界是好求的。令 dpu 为以 u 的子树中的操作次数理论上界,则 dpu=1+vchildudpv,答案为 dp11,因为 1 节点已经被标记。

上界也是可以取到的。考虑递归。每次将 u 的答案和 u 的一个子节点 v 合并答案。这个也是简单的。注意细节即可。

C - CF2025F

不难想到建图:xiyi 连双向边。我们需要对于每条边选一个节点 +1 or 1

最优的策略肯定是选择若干组匹配的边,使得 {xi,yi}{xj,yj}。此时我们可以操作使得这组边和为 0

发现图不好做,所以考虑树的情况。

对于一个树,手玩之后可以发现:

如果边数为偶数,则可以完全匹配;否则无法匹配。

可以利用上界确定+构造(归纳)来证明。

考虑拓展到图。对于图生成树的一条返祖边,我们同样放到深度较浅的节点进行匹配即可。

E - CF1030D

由三角形面积的计算公式,设底为 a,高为 h,则 ah2=nmk,也就是说 ahk=2nm

接下来,可以证明,如果 a,h 没有整数解,则 a,h 也没有实数解。具体证明仅需要简单的小奥知识(一半模型)。

由此,我们仅需要求出 a,h 的整数解即可。由于 2nm 可以到达 2×1018,直接枚举因数是不可做的(当然你用 Pollard-Rho 也没人拦着你)。

接下来,由于题目条件,我们必须保证 an,hm(证明是也是小奥知识)。因此,我们不妨令 a=2nt,h=mtka=nt,h=2mtk,同样可以证明这组解满足条件是整道题目有解的充要条件(证明可以考虑将 a 乘上一个有理数 kh 乘上 1k 之后 a,hn,m 的大小关系)。

于是,我们只需要枚举 k 的因数即可。

F - GYM105257B

首先,由于 n,m 很小,考虑 DFS。

但是这样子跑不动 n=m=9,因此开始找规律优化 DFS。

  • 对于在边界的点,它一定等于 1
  • 两个符号不能相邻。
  • 用上面的性质跑几个比较大的样例,可以发现,对于 (x,y),若 x,y 都是 2 的倍数且 (x,y) 不在边界,则 (x,y) 这个位置填 *

最后直接 DFS 即可。

G - GYM105486K

首先考虑建图。

我们就相当于是有 n 个棋子在固定的点,经过每条边都会获得 1 的价值,点不能重复,问价值最大。

因为每个点到达最后的点的数如果固定,那么答案也固定,所以考虑简化这个图:

xy 连一条价值为 xy 的质因数个数的边。发现这是一个二分图匹配问题,用费用流即可。

H - 洛谷 P11531

首先考虑特殊性质。当 c=n 的时候,原问题等价于最小割,因此考虑网络流。

接下来,分析我们的限制:

  • 断开 pi 的价值为 1。

  • 每条边 (u,v,r) 都要连向 pr

接下来不难给出构造:

  • apiapi,w=1,表示第一条限制。
  • (u,v,r),uapr,aprv,w=1,表示第二条限制。

不难得出这个构造是正确的。

K - QOJ9374

首先, 不难得到一个点能否走的充要条件:

如果 1x 的最短路为 t,且存在一个怪物能在 t 时刻到达 x,则我们不能走 x 这个点。

显然,由于怪物可以原地折返,所以如果我们能在 t 时刻到达 x,则我们能在 t+2k 时刻到达 x

接下来我们就需要求出所有怪物到每个点的奇数最短路和偶数最短路。最后跑 BFS 即可。

Day 5 - 数据结构

A,B - qwq

简单题,略过。

D - QOJ9104

  • F(x)=x+lowbit(i)。证明略。

接下来,发现修改的次数不会很多,直接暴力即可。

F - QOJ7513

首先,考虑这么一个过程:链 -> 树。

在链的情况下,我们有一个很显然的 DP,按照每个相同颜色的距离递增来转移。

这个 DP 是 O(n2) 的,可以用树套树优化。

接下来,把链的做法放到树上。

同样的,用 DP + 树套树即可。

G - QOJ7523

首先分析性质。显然,答案是单增的。

其次,暴力也是简单的。对于一个询问的 k,我们只需要钦定 maxbpi 的值然后用数据结构找到 api 的和最小。

“答案单增”+暴力做法可以考虑决策单调。

证明也比较简单:发现 k 固定时 i 的答案是一个凹函数,且由单增、单减函数相加而成;且 kk+1 是单增的函数会变大。

最后分治即可。

H - GYM105336J

首先,将交换后的 max(f(a),f(b)) 形式化。可以发现,如果我们令 ci=aibiA,B 分别是未操作前 a,b 的异或和,则 (f(a),f(b))=(AiS{1,2,,n}ci,BiS{1,2,,n}ci)

接下来不难想到线性基。由于我们还不知道 f(a)f(b) 那个大,所以我们可以钦定两个数中哪个大,然后继续用线性基。

这个东西相当于是钦定有一位必须异或 / 必须不异或的取 min

Day 6 - 树

trick:弱化问题的限制,同时保证新问题的答案不会优于原问题。

A - QOJ9110

手玩可以发现我们必须得让最大值、最小值都在端点。

接下来运用 trick DP 即可。

B - QOJ8239

看次数猜做法。这里默认我们在判定是否是菊花。

  • 对于 n2 次操作:

我们可以询问 (1,2),(3,4),(n1,n)。由于菊花的性质,我们肯定能找到一条有连边的对 (u,v)

  • 对于剩下 3 次操作:

我们知道,如果一个树是菊花的话,肯定所有点都会向菊花中心连边;而我们既然找到一条边,我们就可以用 4 次操作轻松的找出;加点优化可以到 3 次。

D - QOJ7883

性质:最小瓶颈树=最小生成树。

不难想到枚举最大值,用最小瓶颈树找出次大值。

但是我们需要保证次大值小于最大值,一种方法是暴力用数据结构维护。

但是,由于最小瓶颈树的性质,我们只需要保证一个节点可以通过小于最大值的边到达根节点即可。

H - QOJ7009

点减边容斥:满足条件的路径数量=总的点数量-总的边数量。

而对于这两个东西都是好求的,可以考虑每个点 / 边的贡献。

I - QOJ7755

对于森林中的每个树都求出对应的 SG 值。

而这个 SG 值可以通过手玩得出。

最后通过换根 DP 求出删除点 / 边之后的 SG 值变化即可。

M - QOJ9530

暴力的想法:考虑枚举共同经过的两个端点,然后对于两个端点分别 DP 即可。

接下来,对于 u,v 两个端点在 LCA 计算贡献。令 dpu 表示 u 节点选两条不相交的路径的方案数,k 为 LCA 的深度,则 u,v 的贡献为 (depu+depv2k)2dpudpv

接下来拆开算,可以用若干个 DP 解决。

Day 7 - 字符串

A - GYM105336E

第一问随便做,比较坑的一点是它要取模。

第二问有两种方法,这里讲老师提供的方法。

总期望=每个节点被选的期望之和。

显然,由于我们是均匀随机,每层的节点被选的概率是相同的,而对于第 k 层的节点,被选的期望是 1(1126k)n

然后就做完了。

D - 洛谷 P1117

这是一道 trick 题。

首先有 AABB=AA+BB,于是我们需要求出:以一个点开头 / 结尾的 AA 串的个数。

这时候就要用到我们的魔法了。

trick:

对于这种 AA 串的记数,我们可以这么做:

  1. 枚举 AA 串中 A 的长度 len
  2. 每隔 len 个位置就撒一个点。
  3. 显然,我们的 AA 串会跨过两个相邻的点,令跨过的点为 x,x+len
  4. 在跨过的点固定的时候,我们的每个 “A” 串都可以分为一个前缀和一个后缀。
  5. 前缀的长度和后缀的长度都是有上限的,所以满足条件的 AA 串的左端点和右端点都是一段区间。
  6. 上面这个东西可以用差分加上 SA 或 二分+哈希解决。

然后就做完了。

G - QOJ7512

DP。

fi 表示 1i 中所有分段的 n2(具体参考题目式子),ginhi1

f,g,h 的贡献是显然的。接下来考虑转移:

对于一个区间,当左端点固定时,右端点肯定也是一个区间。这个区间可以用二分+哈希求出来。

最后你会发现我们需要区间加上一个数,单点求和,可以用树状数组。

I - QOJ5311

首先,如果一个字符串是另一个字符串的前缀,那么这两个字符串的大小关系是确定的。

否则,这两个字符串肯定存在一个位置的值不同。设第一个字符串的这个位置是 x,第二个字符串的位置是 y,则:

如果在询问的大小关系中 x<y,则第一个字符串小;否则第二个字符串小。

上述的事情都可以用字典树实现。

posted @   linxuanrui  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示