3 月做题记录

P6292

考虑建出 SAM 后扫描线。

考虑目前一个等价类集合长度区间为 [l,r],显然我们扫到每个位置的时候只需要维护每个等价类的 Endpos 集合中最靠右的位置。我们考虑右端点增加 1 的时候,会被修改的等价类为目前前缀对应的等价类 Fail 树上到根的路径。对于一个 l,r,x,其中 [l,r] 为长度区间,xEndpos 等价类最大值,则对于询问的左区间来说,答案构成分段一次函数。最终每个左区间答案都是关于左区间线性的,维护两个树状数组分别是斜率和截距即可。到根链覆盖直接树剖后 ODT 即可,复杂度 O(nlog2n)

P11830

考虑怎么判定 x 是否可以成为中位数。

对于 li,2xri,2i,显然会取 ri,1x,否则所有 ri,2<xi 都本质相同,li,2>xi 也相同,于是可以得到两个区间分别表示 <x>x 的数的个数在这个范围内,对这个东西解方程就能求出对应范围了。

值域很大,离散化后每段本质相同,双指针后判断即可。复杂度 O(nlogn)

P11831

考虑时间轴分块,每 B1 次操作重构一次。重构时对 a 的值域分块,每一块长度为 B2,每块跑一次拓扑排序 DP 即可。注意将操作所在的块内修改的点忽略,查询时对这些点重新计算。于是需要预处理一个可达关系,使用 bitset 即可。

B1=B2=n23 可以得到 O(n53+n2w) 的做法,但是场上块长调的不太对,实现常数比较大,只能过 6×104

P11833

不难注意到按照 t 小到大排序后依次满足每个限制即可,模拟容易做到 O(n2logV)

注意到我们要做的就是,找到一个位置,然后将一段区间覆盖为等差数列,这个东西很容易线段树维护区间覆盖等差数列区间求和,还需要一个线段树二分。复杂度 O(nlogn)

ARC160D

考虑倒着生成序列。每次选择一个数加 k,或者选择一个长度为 k 的区间加 1

bi[i,i+k1] 这个区间加 1 的次数,cii 这个位置加 k 的次数。则合法序列与 i=1nbi+ci=mk1ink+1,0<bi<k 的序列 b,c 一一对应。

至此可以直接容斥做到 O(n2)

也有一种比较无脑的做法,枚举 i=1nbi=p,显然有 0x(nk+1)(k1),然后相当于要计数 i=1nbi=p,且 1ink+1,bi<kb 序列数量。显然答案等于 [xp](x0+x1+xk1)nk+1,多项式快速幂计算即可。

ARC146D

可以将每个条件转化成四个条件,每个条件形如 x,y,c,d,表示 axyayd

考虑建图,xy 连一条有向边,将 c,d 计入权值中。

初始取 ai=1,每次贪心取最小的 ai 并对邻边进行更新。注意需要进行类似当前弧优化的状物,否则一条边可能被多次更新。精细实现可以做到线性。

ARC183D

忽略每次删叶子后树有完美匹配的性质,以重心为根,答案有上界 i=1ndepi 并且可以取到,因为以重心为根不存在子树大小超过一半,根据经典结论可以每次选不同子树内两个叶子删去。

对于原题,我们声称答案仍然可以取到上界。

首先,对于一棵树来说,任取一点为根,称 0 类点为子树大小为偶数的点,1 类点为子树大小为奇数的点,则其有完美匹配等价于以下三个条件:

  1. 总点数为偶数。
  2. 对于每个 1 类点,其所有儿子都是 0 类点。
  3. 对于每个 0 类点,其恰有一个儿子是 1 类点。

忽略第一个限制,可以发现删除叶子 x 后,后两个限制仍然满足的充要条件是 x 到根颜色是交替的。

对于重心的每个子树,可以 DFS 求出一个删叶子顺序,重心必然在任意时刻都恰有一个儿子子树大小是奇数,其他是偶数,在偶数中选子树大小最大的点和这个奇子树配对并更新子树大小即可。

ARC153D

考虑 f(a+b),显然等于 f(a)+f(b)9×g(a,b)g(a,b) 表示 a+b 的进位次数。

然后考虑数位 DP,对于从右到左第 i 位,显然其右侧加上 x 会进位的数必然是只保留后面的数后排序后的一段后缀。于是记 fi,j 表示到第 i 位,第 i1 位也就是右侧的那位会进位的最小的是第 j 个数。转移可以顺序枚举 j,注意到 jj+1 时只需要在一个集合中加入或删除一个数,查询是查询最小值。set 访问首迭代器的复杂度是 O(1) 的,所以复杂度是正确的。

ARC185D

考虑只有一条链怎么做。这是很经典的,记 fi 表示点 i1i 的期望步数,不难发现 f 是差为 2 的等差数列,直接简单求和即可。

对于若干条链来说,先考虑两条链怎么做,考虑将过程分为到达某个链底端,然后走到另一个链底端。第二部分就等价于一条链从左走到右,第一部分等价于只有一条链,因为每次往上和往下都可以对应成一条链的情况。

对于更多的链,考虑仍然将过程分段,依次是到达每条链的底端。根据期望的线性性将每段答案求和即为最终期望。

第一次到达链底相当于就是只有一条链,而后面的每次等价于事实上只有两条链,但是到根后往已经走过的链和未走过的链的概率不同,这个东西和一条链上的部分一样,只需要把根往下的答案重算一下即可。复杂度 O(nlogmod)

ARC176D

考虑 i=1n1|pipi+1|,拆贡献可以变为 i=1nj=1n1[[pji][pj+1i]]

枚举 i,则序列变为 01 序列。显然本质不同的 j 只需要考虑 (pj,pj+1) 现在是多少,所以本质只有 4 种。

考虑矩阵,对这些东西的贡献转移写成矩阵形式即可。

P6976

考虑分治,每次在当前多边形内选一条边把多边形断开,将两边的询问递归,跨过边的询问直接从选择的边的端点开始 BFS。

考虑复杂度,可以证明必然存在一条边使得较小侧点数至少为 13 的总点数。所以总复杂度为 O(nlogn)

BZOJ3591

加强版:n20

原题是,考虑一般的 DP 套 DP,考虑用那个维护单调序列的做法维护 LIS,那么每个数只有三种状态:不在序列中,在序列中但不在队列中,在队列中。用一个三进制状态即可做到 O(3nn)

这个做法太菜了,考虑按照值域插入所有数,我们只需要记录 fi 表示 [1,i] 的 LIS,显然有 fifi1{0,1},所以状态是 O(2n) 的。

要求给定序列在排列中,考虑记 gi,j,S 表示插入了 [1,i],目前 f 状态为 S,目前在给定序列中出现过的位置最大的在 j。注意到 S2i,状态数是 O(n2n) 的,转移可以做到 O(n),总复杂度 O(n22n)

CF1142D

考虑对于符合条件的数 x,排名为 k10x 的排名是多少。

观察规律能看出 10x 的排名只和 kmod11 有关,对 k[0,10] 打个表出来即可。

然后直接 DP,fi,j 表示以 i 结尾,排名模 11j 的符合条件的数的个数,转移很容易。

CF995F

Dn 时可以直接 O(n2) DP 计算答案。

比较容易猜出答案关于 D 是一个多项式,对 ans1,ans2,,ansn 拉插即可。

另一个做法是,考虑记 gi 表示填入的数有本质不同的 i 个,且每个数在 [1,i] 范围内的方案数。则答案等于 i=1n(Di)gi

考虑 gi 怎么求。考虑之前的 DP,fi,j 表示以 i 为根的子树,点 i 填了 jgi 不等于 f1,i,因为 f1,i 可能并没有完全包含 [1,i] 中所有数。枚举有 j<i 种不同的数可得 gi=f1,ij=1i1(i1j1)gj,直接计算即可,复杂度 O(n2)

CF1499G

好题啊。

先考虑无修改。

这是一个比较经典的问题:给定一个二分图,选一些边,使得每个点的选与没选的邻边数差的绝对值总和尽可能小。

对于这个问题,从所有点度数为偶数下手,此时图存在欧拉回路,求出一条欧拉回路后考虑每条被定向的边 uv,若 v 是黑色点则选这条边否则不选。此时对于每个点,要么所有出边都被选,要么所有入边都被选,所以每个点的答案都为 0,总和也为 0,取到最小值。

有些点度数为奇数时,答案下界为 i=1n[2degi]。这个下界是可以取到的。建立虚点向所有度数为奇数的点连边,这个图有欧拉回路,求出欧拉回路后对所有原图上的边按照同样方式定向即可。

考虑原题,现在要在线加边,维护欧拉回路。问题是由于虚点存在,可能还有删边,不容易做。

考虑这个东西的本质,事实上我们可以证明我们只需要求出以下问题的解即可还原答案:

将二分图的边划分为若干环和路径,路径不要求简单,使得每个点至多成为一条路径的端点。

对于环和路径,都是交替地取边,这一定可以得到最小答案,原因是考虑度数为偶数的点无论如何都只会在环上或者路径的非端点处,所以贡献为 0。度数为奇数的点必然恰好成为一条路径的端点,贡献为 1,正好符合静态的做法。

剩下的过程就很容易了。考虑在路径端点维护对应路径,每条路径只在其一个端点维护。则加入一条边时,分类讨论:

  • 两端都不为路径端点,直接加入这条边作为路径。
  • 有且仅有一端为路径端点,将路径加上这条边扩展为新路径。
  • 两段都为路径端点且属于同一路径,加入这条边后成为环,将环上边删去并加入到答案即可。
  • 两段都为路径端点且不属于同一路径,合并两条路径。

使用 deque 可以很好地支持这个操作,注意到复杂度瓶颈在于最后一种情况的合并路径,于是启发式合并即可。复杂度 O(nlogn)

CF1149E

对于每个点 u 考虑其类 SG 函数 f(u)=mex(u,v)Efv

定义 g(u)=f(x)=uhx。我们声称先手必胜当且仅当 gu>0

证明:

  • 终止状态必然满足 1in,hi=0,则有 gu=0
  • 对于 gu=0 的局面,考虑操作任意一个点 v,那么 hv 减少,必然有 g(fv)0,并且由于 f 为一步到达的点的 fmex,于是 g(fv) 不可能通过修改其他点进行更改,于是 g(fv)>0gu>0
  • 对于 gu>0 的点,找到最大的 x 使得 gx>0,考虑 gx 是若干数的异或,根据 nim 游戏的结论总能减少某个 fv=xhv 使得 gx=0。同时,v 的所有一步到达的点都能被任意修改,所以总存在方案使得操作后 gu=0
  • 局面构成的博弈是有向无环图。考虑若存在某个局面在至少一次操作后回到了这个局面,则考虑最后一次操作的 u 必然在之前的操作中成为过被修改的后继,对那个点重复论证即可得到原图有环,与题意矛盾。

如果能看懂证明的话构造方案是容易的。

CF1830F

考虑朴素 DP,记 fi[1,i] 中最后选了的点为 i,但以 i 为最右被选区间的贡献还未加入时的最大答案。有转移 fi=max1j<i{fj+pj×c(j,i)}c(j,i) 是有多少区间包含 j 但不包含 i

在枚举 i1n 的过程中进行扫描线,则变为了区间 c1,区间查询 max。KTT 维护即可。

CF1158E

对于猜树的形态,经常考虑的做法是以某个点为根后依次确定每个点的深度和父亲。

假设树以 1 为根,问题分为两部分:

  1. 确定每个点的深度。

    注意到我们将 d1 设为 kk1 进行两次询问就能求出所有深度为 k+1 的点,并且能分出深度 <k+1 的和深度 >k+1 的点。

    进行类似分治的过程,初始时求出深度为 mid=n+22 的深度的点,然后可以发现每一步我们得到了形如若干 (l,r,S) 的区间,表示深度在区间 [l,r] 内的点恰好是集合 S,并且可以发现深度为 l1 的所有点必然已经被求出。那么将深度为 l1 的点的 d 设为 midl+1midl 就可以将区间划分为 [l,mid),[mid,mid],(mid,r]

    考虑将过程并行维护,但是发现下一个区间可能会通过父亲的若干条边影响之前的区间,但是这个过程是分治执行的,所以把奇数编号的区间拉出来并行,偶数拉出来并行,两两之间不会影响。

    上述的询问次数是 4logn

  2. 确定每个点的父亲。

    对于深度为 x 的点,依次考虑二进制下每一位 y,将这些点中编号这一位是 1 的点的 d 设为 1,则深度为 x+1 的点的父亲这一位是 1 当且仅当回答的结果为 1。于是将所有回答结果加权求和即可得到 x+1 层每个点的父亲。

    这个过程可以模 3 分组并行,询问次数 3logn

总询问次数 7logn,可以通过。

P11832

对于图是树的时候,以 1 为根,递归儿子对应子树随意排列,将这个点本身随意插入到两个空位之间。

图不是树时,发现环的构造情况较少,具体地只要确定了在序列中出现的最靠前的位置,其他点要么顺时针排列要么逆时针排列,所以事实上环上的点在序列中顺序必然是某个顺时针或逆时针顺序。

注意到同胚于 K4 的子图无解,杏仁图也无解,所以原图是广义串并联图,每个点双是外面一个哈密顿回路和中间的若干条不交的边构成的平面图。

建圆方树,发现对于圆点来说,结论和树上一样,递归到子树构造并随意排列后插入,对于方点限制有所不同,儿子节点必须按照哈密顿回路上的顺序,也就是只有两种需要考虑的顺序,贪心取较小的即可。

所以只需要求一个这样的点双的哈密顿回路即可,直接按照广义串并联图的套路即可,不过这题不需要缩一度点,因为任意时刻都不会有叶子,所以只需要缩二度点与叠合重边,叠合重边时将原有边覆盖即可。

图不连通时先求出每个连通分量的序列答案,注意到我们只需要求任意两个联通分量序列上要么不交要么包含,排序后可以贪心构造答案。

CF1147F

无边权限制时,后手必胜当且仅当图的所有最大匹配都包含起点。但是图是完全二分图,所以后手必胜。

有限制时,后手仍然必胜,只需要找到一个稳定婚姻系统即可。

CF1400F

注意到本质就是给定若干字符串,要求删若干字符使得这个串中不出现给定串,对给定串建 ACAM 然后 DP 即可解决问题。

进一步注意到合法字符串数量很小,当 x=19 时数量取到最大值为 2399,所以直接做就是对的。

ARC179D

当根固定时,我们希望一个一个子树走,记 fi,0/1,0/1 表示从点 i 出发遍历子树内所有点,要求能否用门,要求是否需要回到 i 的答案。转移是很容易的,于是 O(n2) 是很显然的。

这个 DP 很容易做换根,做完了。

P4119

离散化对值域分块,常见做法是先求出答案在哪一块,然后对这一块内每个点求区间内出现次数。后面的部分,区间内出现次数可以分块维护。前面的部分,对每一个值域内的块在原序列上也分块,维护每个块和之前的出现次数总和,每一块再维护一个并查集就可以了。

ARC150D

限制只随机到某些点不好处理,假设会随机选到所有点,但是选到那些点时不计算贡献即可。

根据期望线性性,只需要对于每个 iE(xi)xi 表示操作过程中点 i 被选到的次数。

对于每个点 i,只保留从根到 i 的点的这条链计算答案就是对的,原因是考虑当且仅当点 i 到根都被选后这个点不再有贡献,所以可以假设每次选的点都是在这条链上的,其他情况不影响答案。

考虑这条链的答案,则初始时没有好的点,假设点 i 深度为 d,容易推出式子是关于 d 的一个调和级数的形式,直接计算并对所有点求和即可。

CF1031E

限制很紧,肯定是希望每次至少能删 31,最后剩下的 12 可以爆搜调整。

3 个一组不能一次删完,但是暴搜可以发现每 6 个一组在忽略后面的数时可以 2 次删完,于是前面分组做最后剩下若干个爆搜即可。

CF776G

显然 xy<x 等价于 y 的最靠左的 1 的位在 x 中也为 1

枚举 kx16 进制表达下的最大数码,则可以直接从后往前做数位 DP,记 fi,0/1,0/1 表示到了第 i 位,是否有最高位顶满的限制,后面是否存在某一位为 k,复杂度 O(qlog3V)

CF1535F

忽略不能转化的条件,则答案至多为 2,只需要考虑哪些对 (i,j) 的答案为 1

(i,j) 答案为 1 当且仅当删除 LCP 和 LCS 后有一个串是有序的。

枚举其中有序的那个串,比如是 si,将 si 划分为若干极长连续排序段,只需要对每段算贡献。容易发现每对 (i,j) 有且仅有一段会进行贡献。

建出正串和反串的字典树就变成两棵树的两个子树交,由于权值是排列所以是二维数点问题,扫描线即可。

数论题

考虑什么样的 d,g 会真正的产生贡献而不是相互抵消。

可以发现很多时候 gi=0/1 会将贡献抵消,将 gcd(s,n) 分解质因数,记其为 p1k1p2k2pxkm。则只有 di=kigi=1di=gi=0 贡献才不会抵消。

对这些特定的 d,g 计算答案,复杂度 O(2ω(n))

CF2068K

考虑一个暴力的模型:首先将 ai 相等的点缩一起,假设有 qia=pi,连边 Si,容量为 qi。另外,对于每个时刻 i>0,建立点 ti,对于所有 pji,连边 jti,容量为 1,另外连边 tiT,容量为 1。可以发现在 i 时刻内有解当且仅当只保留 t1,t2,,ti 这些点和对应的边后最大流为 n

直接加虚点的复杂度和答案大小有关,无法通过。

注意到我们可以只建立部分虚点,具体地,每次取最小的需要建立虚点的时刻 i,加入点 ti 后判断最大流是否增加。若增加,将 i+pj 也设为需要建立虚点的时刻,其中 pji。不难证明这样做的正确性。

可以证明复杂度为 O(n2logn)

CF2068H

把这个相邻两项曼哈顿距离补全成环,记 d0=distance((0,0),(xn,yn))

不难发现有解的两个必要条件:

  1. a+bi=1n1di 同奇偶,即 i=0n1di 为偶数。
  2. a+bi=1n1di。即 d0i=1n1di。进一步地,对于所有 i 都有 dijidj,意义是直接走的距离总是不超过绕一圈的距离。

事实上这是充要条件。考虑给出归纳性证明。

对于目前的终点 (a,b),我们只需要找到 (xn1,yn1) 使得新的 d0,d1,,dn2 符合上述两个要求。

考虑条件 1,发现无论如何选择 (xn1,yn1) 总天然满足限制,原因是绕一圈必然有总距离为偶数。

对于条件 2,先考虑 d0[|d0dn1|,d0+dn1],并且 d0 能取到范围内与 d0+dn1 同奇偶的所有值。这个是由于 (xn1,yn1) 总在 (xn,yn) 为中心的一个斜三角形边上。

事实上我们可以证明取 d0=min(d0+dn1,i=1n2di) 符合归纳条件。这个可以分类讨论 min 取在哪一边。

n 很小,咋维护都行。

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