2025省选训练总结

2025省选训练总结

2025-02-13

第一天训练总是令人恶心,虽然说并不困。

看完题感觉都很恶心,随便蹭了一点分就去写我的矩阵树定理了。

T1 是计数,应该是用某种方式 DP。

T2 是树上博弈论,感觉要分讨很多情况。

T3 是最优化问题,可能要用一些特殊的性质。

总结

  • 今天的题有些偏难,没有什么好写的部分分。
  • 现在我需要做的事情还有很多,不仅是做当天的比赛,还有一大堆的知识点需要补,另外就是改之前比赛里的题。

T1

考虑用总数减去不合法的方案数,考虑一个这样的过程:初始 i=1,每次找到最大的 j 使得 i,j 颜色相同,然后令 i=j+1,直到 n。 这样就把原序列划分成了若干连续段 [i1,j1],那么每个连续段内可以随便选区间共 2(ji2) 种,而对于跨过连续段选的区间一定形如 [ip,jq],pq。假设有 k 个连续段,那么变成了一个 n=k 的子问题。

n=i 的答案为 ansifi,j 表示长为 i 划分成 j 个连续段的方案数。有转移

fk,j×2(ik12)fi,j+1

ansi=j=1i1fi1,j×ansj

时间复杂度 O(n3)

2025-02-14

今天把时间用满了,可惜分不算特别高。

今天题目难度倒序,我也是倒序开题。

前面想了很长时间的 T1 但没有哪一档分时好拿的。

看到 T3 感觉更好得到一些部分分于是先开 T3。首先套一个 KMP 的模版求 border 可以获得 30pts。然后加上 m=1 送分的档就有 40pts 了。考虑到串是随机的,我尝试写正解,就是枚举 50 个字符作为后缀然后扔到 map 里查询,然而我发现我不会容斥。决定先做别的题,此时比赛过去了三分之一。

然后去开 T2,再看一遍题目终于看懂了题意,维护根到最远叶子的距离 heii,当 ai 为奇数时答案就异或上 heii,这样就是 O(qn),可以获得 15pts。然后尝试写一些其他的部分分,发现没有操作 1 的档就是带修的临域异或和,可以使用点分树做到 O(qlog2n),于是我就写了一个小时,很多 K 的代码获得了这一档的 20pts。然后又补了一档菊花的部分分,最后是 40pts

尝试再看 T1,最后修修改改只拿到了暴力档的 5pts。

最后得分 5+40+40=85,排名 40+。第一题是当时 World Final 的原题,全场只有一个人过。

总结

  • 今天题目难度倒序,非常考验选手的心态和观察能力。
  • T3 或许多花一些时间想一想如何容斥可能就能过,T1 花的时间还是太多了。
  • T1 没有获得很多人都获得的 25pts,这类题目可能不擅长。
  • T2 正解就是点分树,不过再那之前要经过一些转换,用 1h 写点分树获得 20pts 可能不是非常好的战略。

T2

题面

码量很大的树题。

如果确定了根,一个点的 SG 值就是它到它子树内节点的最远距离。这样可以写出 O(qn) 的代码。也可以使用点分树在 O(nlog2n) 过掉没有修改根操作的档。

考虑一个点的 SG 值只可能是整颗树上距离它的最大值或次大值。考虑处理出直径和直径中点,最大值就是经过直径中点到达一个直径端点。

由于一个点不能往它到当前根的子树方向走,所以我们能发现,取最大值的点恰好是从根到直径中点路径上的点,而其他点则取次大值。

考虑先用点分树计算邻域内次大值的异或和,接下来计算从根到直径中点这条路径上经过邻域的点的最大值和次大值的异或总和。

我们可以以直径中点 Rt 为预处理的树根,计算当前根 rt 与邻域中点 x 的 LCA y,然后从 y 往上下分别跳 ddis(x,y) 即可找到路径与邻域交的两个端点。

然后使用树状数组计算路径异或和,可以差分子树修改,单点查。

对于直径中点有两个的情况,可以在开始时往每条边上插一个点,最大值和次大值除以 2,查询时将 d2 即可。

时间复杂度 O(nlog2n),瓶颈在点分树。代码量 4.8K

T3

考虑到随机数据时 border 不会很长,我们从后往前枚举左端点,每次枚举长度小于等于 50 的子串 a,计算 a 的贡献。

考虑到如果右端点相同的子串 b,c,|b|<|c| 会被重复计算当且仅当 bcborder,所以我们插入贡献时容斥,插入 |c||borderc| 即可。

使用字典树或哈希表记录贡献。时间复杂度 50×n

2025-02-15

今天做杂题。

2025-02-17

T1 是 DP,T2 是数论,T3 较难。

首先思考 T1,想到了可以设 fi,j 表示已知小偷在 i 子树内,小偷已走 j 步的答案。

然后 fi,jmin(fls,j+frs,j+1,fls,j+1+frs,j),但是还要加上点小偷初始在 i 的贡献,我并没有想到如何插入这个贡献。

经过一些乱搞发现每次答案都与大样例差个位数。

然后去看 T2,感觉是很套路的莫比乌斯函数,经过一些推式子得到了一个 O(Tnlogn) 的做法,考虑离线下来然后套上数论分块就可以做到 O(Tnlogn) 了,于是就过了。

T3 不会,于是直接取相邻两项的最大值,甚至暴力也没有写就获得了 24pts。

最后得分 10+100+24=134,大约 80 名。

总结

  • 今天时间没有用满,T3 暴力没写,T1 没有继续思考。

T1

赛后经过自己的思考想到了怎么加入一个点的贡献,再加上题解的优化成功过掉了。

我们先反过来设,这样是取 max 容易一些,设 fi,j 表示小偷在 i 子树内且已经先走了 j 步的最大可抓住的数量。

我们可以先求出小偷行走的路径,把原树剖成了很多条链,那么我们在叶子计算整条链的贡献,即对于叶子 i 记所在链长为 leni,则

fi,j=lenij

合并即

fi,j=max(fls,j+frs,j+1,fls,j+1+frs,j)

这样就能过掉 O(n2) 的档。

考虑优化,由于有用的 DP 数组值域为子树内 len 的最大值。所以考虑长链剖分,合并时用较短数组合并到较长数组,使用指针即可继承较长数组,那么每条链只会被合并一次,时间复杂度 O(n)

T2

再次写一下赛时推出的式子。

根据题意,就是多测 T 次给定 n,m,q

i=1nj=1mij[gcd(i,j)q]

推式子:

k=1qk2i=1nkj=1mkij[gcd(i,j)=1]

k=1qk2d=1min(n,m)kd2μ(d)i=1nkdj=1mkdij

枚举 kd。记 S(x)=(1+x)x2

T=1min(n,m)T2S(nT)S(mT)kT,kqμ(Tk)

C(x)=x2k|x,kqμ(xk)。那么

T=1min(n,m)S(nT)S(mT)C(T)

那么离线后,按 q 排序,每次插入新的 k,然后使用数论分块,用 BIT 计算 C 的前缀和。时间复杂度 O(Tnlogn)

2025-02-18

今天打满了,但比赛时有一些正确的想法没能继续深入。

首先看到 T1 是计数,T2 是 gcd,T3 是树上问题。

首先开 T1,先想到了 k=0 的做法,可以 O(n2) DP 计算 fi 表示长为 i 且没有其他限制的答案。

然后尝试写 O(n3) 的做法,注意到一个性质,如果长为 n 删掉了若干长为 si 的连续段,那么等价于 fnsi。于是考虑枚举 O(n) 个二元组,O(n2) DP 处理这个二元组区间的答案,设 gi,j 表示考虑完前 i 个位置后,已经删掉了总长为 j 的答案。那么可以做到 O(n3)

考虑优化,注意到区间不交,可以把区间按照包含关系变成树的形式,注意到一个区间的总长大于它的儿子总长之和,于是想到了树上背包的复杂度,我们建出树,利用树上背包转移,fi,j×fv,kfi,j+k,时间复杂度 O(n2)

此时过去了一个半小时。

然后火速开 T2,一眼 DP,写出了一个 O(nr2logrlogm) 的做法,大概只能过 r500 的档。想着拿一些性质,看到 A 性质,能不能容斥呢,然后我就又想到了莫比乌斯反演容斥,然而后面就想不到了。

想了很久,此时又过去了一个半小时,只剩最后一个半小时。

赶快开 T3,经过一番思考想到了维护对于每种颜色 O(n) 计算全局的 f,然后就能做到 O(nq+nm) 得到 28pts。想着拿一些性质,或许到达一个颜色的最远点,就是这个颜色集合的直径呢?我觉得不太对,就没有继续想了。事实上这是正解的思路。

最后得分 100+25+28=153,总榜三十多,纪中第七。

总结

  • 今天的节奏还可以,T1 做的比较快,但可惜在后两题没有得到高档部分分。
  • T2 想得不够深入,想容斥时一定要用式子表示,不然光靠心算是很难算出来的。

T2

fi,x,y 表示填完前 i 个数,ai=x(ai1,ai)=y 的方案数。显然有 y|x 所以状态数是 O(nrlogr) 的。暴力转移可以做到 O(nr2log2r)

考虑 A 性质,fi1,x,yfi+1,z,(x,z),那么转移与 y 无关,设 Fi,x=yfi,x,y。考虑枚举 d=(x,z)

fi,z,d=d|xFi1,x[(zd,xd)=1]

fi,zd,d=xFi1,xd[(z,x)=1]

fi,zd,d=xFi1,xdT|z,T|xμ(T)

fi,zd,d=T|zμ(T)T|xFi1,xd

就是对长为 nd 的序列求狄利克雷后缀和,再点乘上 μ,再做狄利克雷前缀和。朴素做是 O(rdlogrd),但可以做到 O(rdloglogrd),可以看:P5495 【模板】Dirichlet 前缀和

具体来说,考虑两个数 i=pkak,j=pkbk,那么 ij 当且仅当 akbk,这是把每个底数看作一维的指数的高维前缀和,枚举每个质数 p,从小到大枚举 d,让 dd×p 即可,利用埃氏筛的复杂度分析就是 O(nloglogn)

回到原问题上来,复杂度就是 ni=1rO(niloglogni)=O(nrlogrloglogr)

接下来考虑有长度为 3 的第二类限制的情况。实际上就是对转移加上了 [(z,y)=1],那么有转移:

fi,z,d=d|x[(zd,xd)=1]yfi1,x,y[(z,y)=1]

fi,z,d=d|x[(zd,xd)=1]yfi1,x,yT|z,T|yμ(T)

fi,z,d=d|x[(zd,xd)=1]T|zμ(T)T|yfi1,x,y

对于 T|yfi1,x,y,因为 T|y,y|x 所以只有 T|xT 有值,所以有 T|x,T|zT|d,所以

fi,z,d=d|x[(zd,xd)=1]T|dμ(T)T|yfi1,x,y

Gx,d=T|dμ(T)T|yfi1,x,y,其中 d|x

fi,z,d=d|x[(zd,xd)=1]Gx,d

类似上面的做法:

fi,zd,d=T|zμ(T)T|xGxd,d

如果求出 G,这一部分就还是 O(nrlogrloglogr)。 问题是如何求 G

Gx,d=T|dμ(T)T|yfi1,x,y

先看后半部分,枚举 x,对于每个 T|xTT|yfi1,x,y,这需要在 x 的约数上做狄利克雷后缀和。之后点乘上 μ。对于前半部分再在 x 的约数上做狄利克雷前缀和。 复杂度还是不变,但我不会证明。

2025-02-19

今天做杂题,是 lxl 讲数据结构,然而与一道 Ynoi 大战了一天,拼尽全力无法战胜。

2025-02-20

今天按照正式比赛的节奏来,没有浪费时间。

T1 想到了每个点都可以表示成一个单位运输量与时间相关的折线函数,那么折线函数的点数是 O() 的,于是可以做到 O(n2)

然而我的实现好像比较劣,由于排序所以多带了一个 log,用归并似乎可以避免这个问题。还有一个小的常数优化就是,要把相邻的相同单位的折线合并。然而比赛时没有优化这些常数,最终正解变成了 50pts,如果加上后面的常数优化就可以得到 6580 分。

我写完 T1 并交上去用了一个半小时。

T2 首先把暴力写了,然后想到了 O(n)ai=1 的档,然后我试图设 fi,i 表示第 i 个位置水量为 j 的方案数,然而直接转移是错的,因为每个位置的水量不是互相独立的。T2 有一档暴力可以多拿 8pts 我决定留着后面来写。

T3 我试图贪心,然而有多测,m3 的大样例里错了许多,最后四十分钟时,我决定写 n5,m3 的暴力,用 map 套上 vector 即可。最后十五分钟时交了上去。事实上我的贪心可以过掉 m2 的档。

最后十五分钟还是把 T2 的 8pts 写了,依然用 mapvector 快速实现。

最终得分 50+32+35=117

总结

  • 最后两题的暴力拿得还不错,但是 T1 写的自以为的正解常数过大,要尽可能优化自己的常数,特别是写的正解,多优化一些常数就有可能得到更高的分数。
  • 不要认为 O(n2logn) 可以过掉 n5000,出题人不会留手。
  • 最后一题的贪心花了过长的时间,导致最后补分时比较赶时间,当贪心错了时就应该尝试其他方法。

T1

std::sort 换成每次与儿子进行归并排序就不会 TLE 了,然而一直 RE 95pts,调了半个小时终于找到了问题,死因是没有开 long long

T2

性质 1:如果某次倒水往左边的杯子倒,则之后的杯子都是空的,之后的操作没有意义。

性质 2:记 bi 为杯子 i 的水量,如果一次把 x 的水倒入杯子 y,则倒的水恰好是 min(ay,bx)。证明:

  • y 为空时,显然。
  • y 不为空时,首先有 y<x,则 x 的水一定是 y 之前倒出的水的一部分。

因此可以设状态 fx,k 表示轮到 x 倒水时,bx=k 的概率。并设 ansx 为期望水量。

我们可以在 x 倒水时结算 x 的答案,如果有后面 yx 倒水,则在 y 结算 x 附加的答案。

于是转移分两种,往左边倒,和往右边倒。时间复杂度 O(n3)。使用前缀和优化得到 O(n2)。再线段树优化得到 O(nlogn)

2025-2-21

今天的题对我来说有点难了,但是感觉 T2 并不比 T1 难,所以说不要因为 T1 不会做而浮躁。

首先看 T1,把路径数和边数和分开求,先写了 O(Tnk) 的做法,有 10pts。然后用前缀和优化,O(Tn),有 25pts。

然后我接着试图再优化,期间想了把它变成二维状态然后观察它的转移,看能不能上线段树之类的,然而发现不可做。这里就等于浪费了一个小时。

最后我把 k30 的档补了就不再看了,最后得分 40pts。

然后看 T2,T2 是交互题,感觉这个询问很神秘,与值域相关的复杂度是不行的,我并没有想到怎么做,于是写了 15pts 的暴力就走人了。交完 T2 还剩一个半小时。

T3 发现有一个 44pts 的部分分很好拿,就是先 O(n) 预处理初始的数组,然后用快速幂做 k 次卷积,模数是 998244389,也不好做 NTT,而且出题人很好只给了 n1000 的档,所以直接 O(n2) 卷积即可,复杂度 O(n2logk)

然而发现大样例过不了,此时还剩四十分钟,最终排查出是取模写错了,这个错误我之前已经犯过一次了,以后要多加注意。

void inc(int &x,int y) {
x+=y;
if(x>=mod) x-=mod;
// 写成了 if(x>=mod) x-=y;
}

T3 还有一个 8pts 的档,是除了第 0 位卷积全部相同的档,但最后没有时间了,我最后没有想出来。

最终得分 40+15+44=99,排名 40+。

总结

  • 今天尽力了,只能说没有意外。
  • 虽然说时间用得比较平均,但是 T1 还是花了较多时间在没有用的思考上了。

T1

考虑容斥,枚举 i 条边中有 j 条长度超过 k,我们可以先给这 j 条边分配 k 的长度,再给所有 i 条边在 nkj 的长度中分配正数。

题解的式子看看就好,具体来说也是很难推的。最后可以得到一个 O(nk) 的做法。

考虑阈值分治,对于 kB 的询问我们 DP 做,剩下的用容斥做,可以得到 O(nB+qnB),平衡得到 O(nq)

T2

如果想到了对值域讨论就很好做了。由于与值域有关的复杂度做不了,考虑对值域讨论一下。

首先所谓的能耗就是最大权独立集,有 DP 式子 fx,0=max(fv,0,fv,1)fx,1=ax+fv,0

我们先分析能耗可能达到的上下界,当 ai=li 时,取到最小值,当 ai=ri 时取到最大值。

考虑增量,当其中一个 iai 加一时,最大权独立集至多加 1。所以最小值与最大值之间都可以取到。

那么我们可以初始让 ai=li,然后从小到大让每个 i 依次进行从 ai=li 一直加到 ai=ri 的操作,这样就取到了所有可能的值,设 i 操作完后的答案是 vi

那么对于一个询问 w(vi1,,vi],我们可以确定每个 aj 的值如下。

aj={ljj>irjj<iri(viw)i=j

j=i 时从 ri 开始减,这是因为如果 ai 加一后答案加了一,这意味着独立集选到了 i,那么以后每次 ai 加一都会使得答案加一,那么不同的答案对应的 ai 的值一定是 ri 结束的后缀。

询问只需二分出 i 的位置即可。

现在的问题是如何求出 vi,这是动态 DP 的模板,可以做到 O(nlogn)O(nlog2n)。但是可以按照 DFS 序修改 a,使用换根 DP 做到 O(n) 且非常好写。

最后的时间复杂度是 O(q1logn+q2n)

2025-02-25

我的心彻底碎掉了。

今天的模拟赛明明已经用满时间了,但是就是没有拿到该拿到的分,果然还是不擅长吗?

T1 是区间内求点对的最值,点对的贡献是 LCP 乘 LCS,我想到了或许可以用支配点对的做法,离线下来然后变成二维数点问题,那么怎么做支配点对才能让点数尽可能少呢???我想不到,想了四十五分钟了。

那么就首先写一个 O(n2logL+qn2) 的做法,用字符串哈希做。然后 A 性质就是区间求最值,上 ST 表即可。然后我试图想随机化的性质,观察到公共前缀与公共后缀大概很小,然而并不是常数级别,至少也要 100n 的时间计算,我并不知道怎么算。

挣扎到一个半小时时,我不再想了,试图在后面的题多拿一些分。

看到 T2,我一直不理解题意,所谓的「端点两两不交」是什么意思?其实出题人就是傻逼,「包含」都能写成「包涵」。但还好过了半个小时用我的暴力验证了题意,我的暴力反反复复修改了好几次。

然后我想更优的做法,题目要求是「所有路径的交至少包含一条边」,注意到若干路径的交一定是路径,所以可以枚举路径的交,然后容斥计算答案,贡献为 (1)dis1。可以求出两个端点的 DP 数组,设 fi,j 表示选了 i 个点 j 权值的方案数,那么枚举 i 对两端点的 j 卷积就可以算答案。

这个 DP 好像很难做,想了想复杂度大概可以做到 O(n3V2logV)O(n3V2),觉得能拿到更多分于是就开始实现了,然而悲剧来了,我写了一个五次方的做法一直调到十一点还没有调出来,中途还经历几次「忘记计算某个贡献」的情况。此时还剩一个小时了。

我不再写 T2 了,觉得写不完或者写了也不会有太多分,但又不舍。最终去开 T3。

经过一番对题意的理解,写了一个 O(3n) 的暴搜。此时还剩下四十分钟,看到有一些 n 比较小的档,可以 DP 做,但是最后还剩十分钟时还没写完,就不写了。

最后得分:40+15+12=67,败在了第一题没有高分,第二和第三题没有把部分分写满。

总结

  • 今天 T1 想到了是支配点对,但还是没有做出来,而 T2 的 DP+容斥 做法细节比较多,我几乎花了一个半小时在这上面,但没有做出来,T3 的题意稍复杂,暴力写完后没有写出小规模的 DP。
  • 我的问题可能在于代码能力不够,再然后可以归结为做的题不够。
  • 今天属于是每道题都有一些好的思路,但是都没能继续深入以及实现。

T1

很妙的解法。赛时只能说想到了一半。

考虑怎么做支配对:我们对于 alrb,如果 val(a,b)=val(l,r),那么称 (l,r) 支配 (a,b)

考虑把正串插入字典树,那么对于一个节点,其子树内所有串的 LCP 至少是当前点的深度 dep1

可以对子树内的串,对它们的反串建字典树 TT 中每个点维护子树内的字符串集合 S,那么对于 T 中一个字符串 A,对于从它到根节点的路径上的每一个点 i,查询他在 Si 中编号的前驱与后继,加入支配集中(若 T 中深度为 dep2i,则应插入权值为 dep1×dep2i 的点对)。

可以考虑在正串的字典树上自底向上启发式合并每个点的 T,那么每次往 T 中插入一个字符串 S 时,查询遍历到的每一个点的子树内 S 编号的前驱与后继,T 中每个点用 set 维护编号集即可。时间复杂度 O(Llog2L),最后有 O(LlogL) 个支配对。

最后对 l 扫描线,r 用树状数组维护,做二维数点即可。总时间复杂度 O(Llog2L)

T3

很难想到的转化。把普通 O(n3) DP 变换一下贡献的位置,然后重新考虑 DP 的含义,再用组合意义拆贡献,然后就可 O(m3+Tm2) 做。

2025-02-26

今天是省选前最后一场模拟赛,拿到了应拿到的分数,不过后半程稍微有些乏力。

今天大体的策略就是先把每道题的暴力快速写完,然后再想更高的分数,发现这样可以拿到应拿的分数,而且避免了前半程思维固式与犯困的问题。

看到 T1 是跟「矩阵的秩」有关,似乎不是很擅长,T3 则是计数,而 T2 是数据结构,所以先开了 T2。

首先第一档直接开一个 O(nm) 的数组记录历史,然后 A 性质是线段树板子,B 性质考虑肥节点每个位置开一个 vector 记录历史即可,回溯历史就二分位置。此时获得了 36pts。

然后去做 T1,先 2npoly(n) 模拟,矩阵的秩其实就是消元后对角线有值的个数。然后 A 性质答案就是 n,这样获得了 45pts。

然后去写 T3,看到 C 性质可以设 fi,j 表示 i 子树内预留了 j 个空位,然后可以考虑给 i 预留空位以及把 i 往下填一个空位,可以做到 O(n3)。同时第二档就是枚举值后跑 C 性质。

接下来就是补分,T1 放在 T1 一定有它的道理。考虑链的性质,我先把链的秩打表,发现 d 个点的链,它的秩为 d2,所以可以知道奇数个点不能选,同时大于 2 的偶数个点不能选,也就是说要把链拆成一个点或两个点的组合,那么递推式就是 fi=fi1+fi2,是斐波那契数列,这样获得了 75pts。

然后我想去写 T2 的更多分,但发现有些难写,而 T3 就更想不到了,最后一个小时的时候,我才会了 T2 的第二档用可持久化线段树模拟的档,然而最终没写出来,有一个 vector 不知道为什么只要 push_back 就会 RE。

最终得分 75+36+30=141,没有挂分然而发现很多人都过了 T1,所以最后的排名不高。

总结

  • 今天的节奏掌握的不错,前面用了一半时间写暴力,后面时间冲更高分,这样可以防止最终没有获得该拿的分数遗憾离场的情况。
  • 但也有一些问题,开始 T2 写得比较慢,花了一个半小时才获得了 36pts,并且后面的一个半小时没有获得任何分数。

T1

可惜的是,正解与链的结论是一样的,就是把树剖成点数小于等于 2 的链的方案数,简单 DP 一下即可,复杂度 O(n)。证明就考虑如果有两条边相邻,那么发现删去一条边后,秩不减。

T2

正解是 O(nlogn) 时间、O(n) 空间,然而需要在动态树上做历史和,非常麻烦。事实上把 O(nlogn) 做第二档的做法改一下就能通过这题。

赛时就想到了如何做第二档,查询与区间加都是常规操作,可以标记永久化。考虑区间历史回溯:

  • 对于修改 [L,R],若当前区间 [l,r][L,R] 的子区间,将历史区间复制为当前区间,并加上路径上的历史标记。
  • 若当前区间与 [L,R] 不交,将上次修改后的区间复制为当前区间,并加上路径上总的标记。

于是每次新建一个没有标记的节点,下传时分别加上历史标记与总的标记,回溯时需要合并子节点的和。

这个做法是时间与空间都为 O(nlogn),可以获得 24pts。参考题目中的「小 γ 于是想到在刚刚接触 OI 的时候了解到的时间换空间的原理」。考虑对序列分成 O(logn) 个块,我们做 O(logn) 次上述做法,每次只需考虑当前块内的信息,时间复杂度 O(nlog2n),空间复杂度 O(n)

T3

原来 C 性质可以用反悔贪心做,用一个堆维护子树内最小值,用可并堆即可走到 O(nlogn)

正解是考虑一个经典 Trick,枚举 V,对于 aiV 赋点权为 0,对于 ai>V 赋点权为 V,答案就是枚举所有 V 做一遍上述过程。

那么现在每个点有 A 种方案取 0B 种方案取 1,当一个点取 1 时,可以与子树内一个未被匹配的 0 形成 1 的贡献,于是设 fi,j 表示子树内留下了 j0 的方案数,gi,j 表示子树内留下 j0 时,所有方案的贡献总和。

这是一个树上背包问题,确定 V 后可以做到 O(n2),枚举 V 可以做到 O(Vn2)

考虑将所有 l,r+1 插入 t 数组种离散化,那么设 F(v) 表示上述 DP 的答案,发现对于 [ti,ti+1) 中的每个 vF(v) 是系数相同的关于 vn 次多项式,于是拉格朗日插值。具体的我们插入对于每个 j=0n,插入 k=titi+jF(k),即插入前缀和,那么求值时带入 ti+11 即可求值。

上述过程中,需要先枚举 t 的每个段,每个段至多求 n 个值,复杂度为 O(n4),求值的复杂度为 O(n3),总时间复杂度 O(Tn4)

posted @   dengchengyu  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示