2 月记录

P11458 [USACO24DEC] All Pairs Similarity P

一个 O(k2k) 的做法。

发现 |ij||ij|=|i|+|j||ij|1

那么我们要对所有 ai 求出:

k|ai=kk|aj=k[ai|aj=k]|aj||k|=k|ai=kk|aj=k[ai|aj=k]bjck

不考虑 [ai|aj=k] 的限制,上面的式子可以看作对 bj 做高位前缀和,除以 ck,再做一遍高位后缀和的结果。

加上限制,我们考虑在除以 ck 之后,对每个 k 乘上一个预处理出的容斥系数 coefk,这个系数满足对于所有 sk|s=kcoefk=1ck,这个东西对 1ck 做一遍高维后缀差分即可求出。

这样就对了。

还有一个 O(n2k2) 的做法,下面提到过了。

P11645 【MX-X8-T4】「TAOI-3」Warmth of the Eternity

直接考虑重心作为根。

这样每个点的父亲就确定了,根据每个点儿子子树大小作为位置,方案数是可重集排列数。

P11646 【MX-X8-T5】「TAOI-3」蓝宝石的存在证明

cnm。

对于树,手玩发现,对每个度数 >1 的节点,周围都存在度数 =1 的节点就是好的。

对于图也是对的。

这样内部的图以及外部的叶子可以分开计算,内部就是有标号树计数和有标号连通图计数。

P11648 【MX-X8-T7】「TAOI-3」2236 A.D.

有一个 O(2k2nlogn) 的做法。

使用 dsu on tree,你需要支持 O(2k2) 插入,O(2k2) 查询所有插入的数与 x 或起来后的权值和。

具体来说,分成高位和低位,设查询的是 x,另一个数是 y,思路为:

  • 预处理先枚举 x 的低位的值,与 y 进行运算,存下我们钦定的值和 y 的高位,同时我们可以知道低位运算的答案。
  • 在查询的时候,枚举 y 的高位的值,拿 x 的低位去匹配,调用我们存下的信息,同时也能算出高位运算的答案。

还有 O(nk2k) 的做法。

直接在树上做启发式合并。

考虑根号分治,每个集合维护 B 个零散值和若干信息,散块和散块合并,超过了 B 就暴力重构一下,只会重构 O(nB) 次。

整块和整块合并,只会进行 O(nB) 次,先 O(2k) 将标记下放,然后处理零散值,FWT O(k2k) 处理两个块之间的贡献,然后 O(k2k) 合并和更新块信息。

散块和散块直接暴力,看似是 O(B2) 的,但其实根据树上背包的复杂度分析总和是 O(nB) 的。

散块和整块,直接枚举散块的点,查询整块的信息,怎么查了,就是 P11458 这题了,就是形如给定 x,查询集合里的 yay×bx|y 的和。

CF2062D

观察发现操作是子树加以及子树补加。

考虑贪心,记 fu 表示子树全部相等的最小值,gu 表示在此情况下子树内子树补的操作数。

发现在进行子树补操作时都是必要的,说明这样可行。

CF2062E2

唐了。

对于 E1,先手选的点 u 必要满足子树外存在 v 使得 wv>wu,称这是好点。

先手选择 w 最大的好点,那么后手只能选中坏点,从而胜利。

对于 E2,同样考虑先手选了 u,删掉 wu 的点以及 u 子树内的点,然后考虑后手,钦定后缀必败,即不存在好点,枚举后手的决策点 v,对于所有 wx>wv>wu 的点 xx 必须在 u 或者在 v 子树中,设 g(v) 表示 v 子树外所有 >wv 的点的 LCA,则条件等价于 ug(v) 的祖先。

那么 u 合法的条件是对于 wv>wu 的点 v,满足 v 要么在 u 子树内,要么 g(v)u 子树内。

线段树维护即可。

CF2062F

考虑固定起点终点。

max(x,y)=x+y+|xy|2

变成绝对值了,那么可以证明一定是从小端点往下走到最小的点,然后往上走其他点,到达最大的点,再走到大端点是最优的。

当然不会拆绝对值,就只能打表对相邻 max 和的值观察了哈哈!!

那么直接 dp 即可,维护左右端点。

加入第一个点,他的类型可以是头或者最小值。

插入一个点,可以选择放到头、放到尾(得到解),放到中间。

CF2063F2

对每个空格维护覆盖他的括号的最大的左括号位置。

tl 表示 l 对应上面的空格数,那么方案数就是 C(tl)

修改就是区间取 max,套到吉司机上,只会修改最小值这一种数,是好维护的。

CF2056F2

写过了。

P10789 NOI2024] 登山

我们以起点和跳跃到达的点作为关键点。

fi 表示以 i 为起点的方案数。

转移就是:

fuvsubtree(x)xanc(x)[dx[dvRv,dvLv]][dx<minpath(u,v)]fx

这个 dp 转移顺序要求我们从上往下,而我们又要记录子树信息。

考虑直接对一条重链求 f,求完后再从上往下递归处理轻子树。

我们先在重链上从下往上处理轻子树的对祖先 x 的要求区间 [l,r],拆成 r,l1 的两个单点前缀求和,对于每个重链上的点,我们需要将这些点对 duhu1min,均摊复杂度正确。

考虑将修改过程记录下来。

处理出 ftopu,从上往下倒推修改过程,注意到 fk 修改时一定在所有点的最后面,所以修改时对原有信息无影响!!!

于是时间复杂度 O(nlog2n)

AT_agc057_e

对于 01 情况,打表发现矩阵 A 合法当且仅当行 0 个数和列 0 个数与 B 分别的可重集相等。

然后就不会做了。

但仔细思考,对于 Br 序列和 c 序列,操作到 A 的序列,可以先交换 r,再交换 c,显然要求 r 是染色后本质不同的,而操作 r 不改变 c,也不改变列阶梯的形态,故 c 也得是染色后本质不同的。

那么说明,一种 r,c 的本质可重集排列方案唯一对应一个 A

对于 k[0,8]A 合法等价于存在两个排列 pk,qk,使得 [Ai,jk]=[Bpi,qjk]

然后我们转为计算排列 (p0,q0,p1,q1,,p8,q8) 的方案数,但是由上知,会算重,简单除一下固定的颜色数就好了。

仔细思考,我们的条件可以转化为 k,[Bpk(i),qk(j)k][Bpk+1(i),pk+1(j)k+1]

条件可以改写成 [Bi,jk][Bpk(i),qk(j)k+1]

ai 表示 Bki 行的 0 个数,bj 表示 Bk+1j 列的 0 个数,则条件等价于:

jaipibqji[1,n],pimin{bq1,bq2,...,bqai}=bmax{q1,q2,...,qai}

fi,j 表示 max{q1,q2,...,qi}=jp,q 的方案数,当 at=i 时计算 pt 的方案数:

fi,j(ji+1)fi1,j+k<jfi1,kfi,j(bjt+1)fi,j

时间复杂度 O(Vnm)

PKUWC 2025 Day 2A. 网友小 Z 的树

妙妙题。

任选两个点 x,y,询问所有 (x,y,i),记最大结果点为 z,可以证明,要么 z 为直径的一个端点,要么直径两个端点分别是距离 (x,z) 最远的点和距离 (y,z) 最远的点。

画画图妙妙证明!!

询问所有 (i,x,z),(i,y,z) 可以得到 dx,z,dy,z(最小的结果除以 2)。

有个问题,如果距离为 1 得到的结果为 2,分别用一次询问二即可。

可以得出 dx,y,根据 (i,x,y),(i,x,z),(i,y,z) 能算出 di,z

对两种可能的直径取 max 即可。

PKUWC 2025 Day 2B. 盒子

PKUWC 2025 Day 1C. 基础博弈练习题

P9334 [JOISC 2023] Mizuyokan 2 (Day2)

这不会是鱼?吧????

显然可以进行调整,使得小段长度为 1

大段 [l,r],需要满足 i=lrai>max(al1,ar+1),容易发现从一个点,只需分别往左往右扩展 O(logV) 次后就会合法,也就是说,对于一个长度远大于 O(logV) 的大段,其存在一个长度为 O(logV) 的子段是合法的。

我们预处理 rigi 表示以 i 为右端点的最短合法大段。

然后考虑一个贪心,上一个大段右端点为 r,我们需要找到最小的点 pr+2,使得 rigpr+2,记为 nxtr

简单发现若 rigp>r+2,我们可以实现拼接。

这个贪心可以理解为最大线段覆盖独立集,所以贪心是对的。

如果没有修改就可以倍增,与模拟赛的一道题是类似的。

简单观察,发现 nxtrr=O(logV)

我们预处理 nxt 的话,rig 只需处理到 O(logV) 的长度。

而修改,也只会影响 O(logV)rignxt

在线段树上处理即可,维护 O(logV) 个信息,表示左端点为 l+k,k<O(logV) 时往右贪心到达的点与分的段数。

就做完了。

CF2034H

显然 xi 序列的合法条件是 gcdji{xj}xi,等价于存在 piqi,满足 piqixi,且 piqixj(ji),就是说存在一个质数 p,满足 xip 上的幂次是严格最小值。

转换对象考虑,一种合法的 pi,qi(1ik) 序列,显然 pi 互不相同,如何判断能否找到一组合法的 x 呢,令 G=i=1kpiqi,那么有解当且仅当 i[1,k],fGpiqi>fG,即中间存在数是其他的倍数,但不是当前的倍数,显然这样的 xi 是不会重复的。

那么 pi,qi 序列应当满足 Gp1q1M,则 p1q1M

爆搜即可,搜出来 k6

P4365 [九省联考 2018] 秘密袭击 coat

P11524 [THUPC 2025 初赛] 背向而行

观察一列最后剩下的是一段,然后可能缺少一个数。

定义 (l,r,p) 为这样的形态,区间没有缺数的话,调整为 (l,r+1,r+1)

nnd。

竟然能发现两个这样的区间的 l,r 有交的话可以合并成一个新的 (l,r,p)!!!

关于合并方式可以发现坐标和不会变,然后可能打下表可以求出合并方式??

然后就单调栈维护即可。

P10439 [JOISC 2024] 逃生路线 2 (Day4)

https://www.cnblogs.com/Xun-Xiaoyao/p/18139013

AT_arc176_d

https://www.luogu.com.cn/article/k499hoh4

P10081 [GDKOI2024 提高组] 新本格魔法少女

考虑对操作序列扫描线,维护出 R=i 时所有 L 的答案。

考虑对序列分块,分别计算下面的贡献:

  • 所有修改对散块查询的贡献。
  • 整块修改对整块查询的贡献。
  • 散块修改对整块查询的贡献。

对于情况一,枚举每个查询覆盖的散块,维护出每个位置上次覆盖的时间 t,那么有贡献就是要求 Lt

注意到贡献的修改有 O(mn) 个,而询问只有 q 个,使用 O(1)O(n) 分块即可。

对于情况二,即当前整块的上次修改也是整块的,同上。

对于情况三,考虑一个散块修改操作的贡献,首先要求 Lt,然后贡献就是权值乘上加入时刻到 R 中当前块询问的次数 删除时刻到 R 中当前块询问的次数。

关于颜色段均摊的颜色覆盖的分块暴力找段的 O(nn) 方法!!!

使用 O(n)O(1) 分块即可。

对于前者,继续转化成 LR 的询问次数 L 到加入时刻的询问次数,后者同理。

代码实现很牛。

P8569 [JRKSJ R6] 第七学区

01 矩阵的转置维护。

P10435 [JOISC 2024] 有趣的家庭菜园 5 (Day2)

假设 b[l,l+n1],l[1,n] 的半圆中匹配,另一种情况是同理的。

分配颜色后,最优情况肯定是 a,b 排序后顺次匹配。

考虑二分答案,对 ai 求出合法的 b 中的匹配区间 [l,r]条件可以转化为 ai 在半圆中的 a 的排名在 [l,r]

再考虑序列 a 的特殊形态,发现排名的变化是简单的,可以分别求出 ai 能与 b 匹配和与 c 匹配的两个 l 的区间。

那么直接查询一个 l 被覆盖次数是否为 2n 即可。

CF2057F Formation

二分答案 M ,判断就是钦定一个数 i 到达 M,显然只会修改前面的值,找到最大的 j<i,满足 ajai2ij,则代价就是 k=j+1iM2ikak

考虑枚举 ij=kO(logV),根据 [j+1,i] 求出 M 的范围与 a 的和,定义为一个决策。

对决策扫一遍维护出每段区间的最大 a 的和,即关于 M 的最大 a 的分段函数。

然后对所有询问一起二分 O(logV),那么我们需要知道 O(q)mid 的最小代价,另类整体二分??!

从小往大对 mid 处理,需要找到 mid 在每个 k 的哪个段,由于单调性,指针扫即可。

时间复杂度 O(nlog2V)

P10438 [JOISC 2024] 塔楼 (Day3)

https://www.cnblogs.com/Xun-Xiaoyao/p/18139013

CF2043G Problem with Queries

答案就是 (rl+1)2x=1ncntl,r,x2

考虑分块,先差分成 x=1n(cntr,xcntl1,x)2,拆成 a2+b22ab

考虑求 a2,每个块右端点维护所有 cntR,x,这样一次查询 O(n) 推过去,并 O(n) 更新后面的块的信息即可。

考虑 ab,可以先缩成 [L,R],其中 L 为块左端点,R 为块右端点,后面再用前面维护的 cnt 信息,推过去。

记这样的答案为 WL,R,考虑修改会怎样更新 W

  • p<LR,WL,RcntL1,x+cntR,x+1
  • LpR,WL,RcntL1,x

可以转化成:

  • L[1,ed],R[p,ed],WL,RcntL1,x
  • R>p,L[p+1,R],WL,RcntR,x+1

其实就是行列区间加,发现是独立的,可以拆成行列的 O(nn) 次单点修改。

后面求单个 W 时就将一行一列的标记推过去更新即可。

时间复杂度 O(nn)

P8478 「GLR-R3」清明

所求即:

ci=1nj=0min(k,i1)cij,j

ci 选到的 ci,jj 集合为 Si

cSi=1njSici,j

Si=1nci[j=0kci,j=ai]jSici,j

问题变成了,有 ri=min(ni,k)+1 个盒子,其中有 |Si| 个好盒子,好盒子放了 x 个球贡献 x,其他盒子贡献 1,一种方案的贡献是所有盒子贡献积,求往 ri 个盒子放 ai 个没有区别的球的贡献之和。

可以推出就是 (ai+ri1|Si|+ri1)

分讨,kn2

直接状压后面的位置是否被使用。

高维前缀和优化即可做到 O(nk22k)

对于 k>n2 的部分,考虑容斥 [k+1,n] 对前面 Si 的贡献是否非法,然后 dp,对于钦定非法的,在 ik1 时才将其加入数组的第二维。

长佳蕊(grow)

有趣的游戏(game)

矩阵(matrix)

路径(path)

迷失(lost)

异或(xor)

棋子(chess)

序列(sequence)

变换(transform)*

随机(random)

替换(replace)

游走(walk)*

树上最小连通块(tree)

袭击(pillage)

前后缀(string)

排序(sort)

多项式多点求值(min-max)

真随机数生成器(random)

快速高斯消元(gauss)

最小曼哈顿路径(manhattan)*

数方题(fang)

数环题(huan)

数链题(lian)*

半城烟沙(grid)

神明的迷思(god)

仙人 掌(color)

名もなき何もかも/皆无其名(A)

傷つき傷つけ痛くて辛い/受伤(B)

運命の華/命运之花(C)*

P9265 [PA 2022] Chodzenie po linie

首先先分成若干联通块。

考虑数每个点的终点在他之前的最短路和。

xdis(i,x) 转化为 t1x[dis(i,x)t]

t2 是简单的。

t=3 时,向左走到下标最小的 l,向右走到值最小的 r,则条件等价于 j<l,pj<pr

继续考虑 t=4,t=5 的情况,扩展上面,设 ui 表示 i 向左走到的最左的点,di 表示 i 向右走到最下的点,则有 (at+1,bt+1)=(ubt,dat)

这些会形成一棵内向树。

考虑证明总点数为 O(nn)

因为 datbt,则我们设所有 y>x,py<px,ydx 的点为 b1,b2,...,bk,记前 n 个为好对,其他为坏对。

则若跳跃途中碰到坏对 (x,y),则满足 yx>n,会跳到 (uy,dx),满足 dxyn,则 x+y 减少了 n

故总跳跃点数为 O(nn),记忆化就能搜出所有点。

按照 x 从小往大扫着些点处理权值,即左下二维数点,单点加,区间和,分块平衡即可。

时间复杂度 O(nn)

CF2066E

CF1889F Doremy's Average Tree

赛时想的贪心很有问题。

还是考虑按位贪心,考虑到了 x,那么我们只能选不影响前面取值的点操作。

如果没有操作覆盖 x,那么找 x 深度最小的祖先去覆盖,后面再反悔。

如果有操作 p 覆盖 x,那么我们需要将 p 子树内之前的点重新分配一个不覆盖 x 且深度最小且可选的点。

这样 x 就能选择它的一个更优的祖先了。

妙妙贪心。

P11665 [JOI 2025 Final] 只不过是长的领带 2 / Just Long Neckties 2

题目等价于从原序列取出若干个数形成新序列,且原序列中相邻两个数至少取一个,求新序列最少用几个不下降子序列可以覆盖。(就是最长下降子序列)

不过似乎两种看法都能做?

fi,s 表示选了 is 状态是否合法,值域是 0/1

考虑只维护 min/max

gs 表示 s 合法的最大 i

考虑 s 变化过程,往右若干位置上的 a 都在 s 内,此时 s 不变,当 ajS,aj+1S 时,一定会变化,更新 gs,维护这个过程即可。

妙妙维护。

nxti,x 表示最小的 j>i,使得 aj=x

nxt2i,x 表示最小的 j>i,使得 aj1=ai,aj=x,预处理就继承 ai 下一个位置的答案即可。

查询上面的过程的一个最小的 j 的时候,先枚举 aj 的值,再跳到下一个 aj 的最近的位置,查那个位置的 nxt2,x 即可。

妙妙。

AT_codefestival_2016_qualA_e LRU パズル

三人班咖(sb)

P10067 [CCO 2023] Real Mountains

CF2023E Tree of Life

【PR #15】最小表示法

【PR #15】二叉搜索树

CF2061I Kevin and Nivek

fi,j 表示前 i 场比赛获得 j 次胜利的最小花费。

观察到:将 fl,j 转移到 fr,,当 |j(lj)|>rl,则:

  • 对于类型 2:我总是会赢或者输。
  • 对于类型 1:我肯定取 [l,r] 中前若干小的 ai,即 ai 排序后的前缀和。

fl,j+gifr,j+t+i,这可以使用分治做到 O(nlogn)

注意到剩下需要转移的值的个数是 O(rl) 级别的。

直接进行分治就好了。

P11678 [USACO25JAN] Watering the Plants P

主教(bishop)

懒标记(lazy)

消除(clear)

AT_arc188_d [ARC188D] Mirror and Order

考虑若 2i1 出现在 a 中,2i 出现在 b 中,设 2i1a 中位置为 x2ib 中位置为 y,则第二位的比较中 cx<cy,令一种情况同理。

那么若看成无向图,每个点度数为 2,联通分量为若干环。

不合法当且仅当每个环的有向边方向相同。

考虑将边方向转到点上。

根据 aimod2 的值,可以知道 ai 是否一定有一条有一条入边或者出边。

结论:一个环上的有向边方向相同,当且仅当环上所有点的 aimod2 相同。玩玩就能证了。

则现在问题变成,有若干黑链,若干白链,还有若干黑白链,还有若干环(环需要黑白色的)。

要求计算连边方案,使得最后环都是黑白色的。

容斥即可。

P10064 [SNOI2024] 公交线路

考虑条件即每两个叶子能到达的集合有交。

于是就是所有叶子能到达的集合有交。

交是一个联通块,考虑点减边容斥。

考虑对于两个叶子 (p,q),若 p,q 有边则都满足了,无法分开考虑。

考虑对不能到达的叶子容斥。

我们可以对子树内的背包,同时钦定子树外的叶子必须到达。

这样子我们可以正确地处理子树内钦定 i 个叶子不能到达的方案,从而使得容斥是正确的。

若钦定考虑了 s1,s2,就得考虑 s1s2,而除了并之外始终满足,这也是可以容斥的!!

单边容斥!!

妙妙啊!!

P10881 「KDOI-07」能量场

考虑先将环缩起来,再去掉那个点,使用矩阵树定理,|DA|,发现 rank(A)2,可以快速计算行列式。

然后还有环上贡献,k0,k1,k2,也可以计算环方案数,可以分段 dp 做到 O(n4)

优化考虑将环与非环合起来算,Di,i=nai+S,继续乘法分配律,每个点的贡献就只有 ai0,ai1,ai2,那么我们只需要给每个点钦定一个次数,然后在去考虑一组 (k0,k1,k2) 的组合方案就行了。

时间复杂度 O(n3)

QOJ9840

P11802 【MX-X9-T6】『GROI-R3』Graph

P8362 [SNOI2022] 数位

P8322 『JROI-4』少女幻葬

P9152 待黑白分明

显然可以建出大根笛卡尔树然后 dp

然后从大到小插数,相当于插叶子,会更新一下祖先的 f,然后插到 l 时,[l,r] 的答案就是 r 的点的 f 之和。

树高 logn 直接暴力即可。

考虑树分块,撒 n 个关键点,预处理关键点 f+1 对所有祖先的贡献系数。

然后插入一个叶子,直接先暴力处理到第一个关键祖先的链上的贡献,然后对第一个关键祖先打标记。

询问时枚举所有关键点回答询问即可,预处理关键点对 r 的祖先的贡献系数即可。

P7341 『MdOI R4』Phoenix

P11694 [JRKSJ ExR] 淇宝的划分

发现若存在 ai<aj<ak,且选择了 GLL,则 lcm2aj,gcdai,没有单选一个 ajL 更优。

于是只有一下形式:

  • LLLGGGG
  • LLGGGLGGG
  • GGGLGGGG

一三都是简单的。

考虑二,发现若存在 ai<aj<ak,且选择了 GGL,则 akai>ajaigcd,akgcd>ai,当存在 ap<ai 时,没有单选 aiL 更优。

于是情形二就是 LLLGLGGG,简单判一下即可。

P8500 [NOI2022] 冒泡排序

显然可以只取出现过的数。

并且任意确定的位置若存在 ax>ay,则交换更优。

考虑性质 B,为每个任意确定的位置找到最优的最小位置,可以严格证明是单调的,故直接取这些位置即可。

考虑性质 C,最优的显然是将最小值放在区间开头,然后给区间每个位置一个 v 的限制,然后我们将贪心修改为满足下界条件的最优最小位置,证明也是类似地。

然后考虑有交的区间怎么做。

先按照值从大到小考虑一类区间,需要提取出没被覆盖的点考虑,这样这类区间就不会和之前的区间交了,考虑完这类区间再覆盖它们。

而一个点会被一类的多个区间包含,考虑将区间按照左端点从大到小排序,找到左侧开始第一个没有被比自己值大的区间覆盖的点并打上"必定为自己的值"的标记,当然如果自己的区间内有先前和自己值相同的其他区间打的标记就可以跳过。容易证明,这样贪心是最优的。

就做完了。

P8922 『MdOI R5』Squares

考虑极大的区间需要满足边界上至少有 3 个点,否则调整更大。

那么枚举下边界点 i,对于一个 l,就是找 y[yil,yi]xi 的前驱后继距离,发现可以二分。

在主席树上二分做到单 log

接下来需要求包含一个点的最大边长正方形。

首先有扫描线,线段树上每个点维护一个 set 的做法。

但是若包含一个点的两个正方形 A,B,若 A 的边长比 B 长,且 A 的有边界比 B 右,那么在加入 A 时,B 就没用了。

可以用 deque 维护,这样还不用删除,直接弹开头,判是否为空即可。

还不会

https://www.luogu.com.cn/problem/CF2029H

https://www.luogu.com.cn/problem/P5291

posted @   蒟蒻orz  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-02-08 P3731 [HAOI2017]新型城市化
点击右上角即可分享
微信分享提示