没写题解不意味着没做,有的忘了写或者太草率了就算了。
部分前言删了。
2020
ZJOI 抽卡
题解
有趣的题目。
后面的部分不翻某混凝土数学真做不来。
设
qA,n=P(当前抽卡池为 A,随机 n 轮后仍未终止)
qA(z)=∑nqA,n(|A|z)nn!
则
|A|nqA,n
的组合意义是 n 轮未终止的方案数。从而 qA 是关于 |A|nqA,n 的 EGF。
显然,假设 A,B 两抽卡池互不干扰,则 qA+B=qAqB。
原因:由二项分布可知,
qA+B,n=∑m(nm)|A|m|B|n−m(|A|+|B|)nqA,mqB,n−m
拆开即得证。(或用 EGF 组合意义亦可得证)
最终答案即为
∑nqU,n=(ΞqU)(1|U|)
其中 Ξ 表示 EGF 转 OGF,U 表示总抽卡池。
不妨考虑 A=[1,m]∩Z 时 qA(z) 形态。
设 fm(z) 表示考虑了前 m 个角色,不存在被连续选择的 k 个角色,且最后一个角色未被选择,zn 的系数对应经过 n 轮选择的方案数,这样的 EGF。
显然 qA(z)=fm+1(z).
从而
fm(z)=[m=0]+k−1∑i=0(ez−1)ifm−i−1(z)
设 u=ez−1,则
fm=[m=0]+k−1∑i=0uifm−i−1
设
f(x)=∑mfmxm
则
f=1+(k−1∑i=0ui)f
于是容易解得
f=1−ux1−x−ux+ukxk+1
考虑
qA=fm+1=[xm+1]f=[xm+1]11−x−ux+ukxk+1−u[xm]11−x−ux+ukxk+1
所以只用考虑如何解决
[xm]11−x−ux+ukxk+1
考虑
[xm]11−x−ux+ukxk+1=um[xm]11−u−1x−x+u−1xk+1
因此考虑
[xm]11−ux−x+uxk+1
于是
[xm]11−ux−x+uxk+1=∑t(1+k)≤m(m−tkt)(−u)t(1+u)m−(k+1)t=(1+u)m∑t(1+k)≤m(m−tkt)(−u(1+u)k+1)t
后面这个复合乍一眼非常不可做,于是考虑一些科技。
我们有:广义二项级数
Bk(z)=∑t(tk)t−1––––ztt!
满足
Bk=zBkk+1
Brk=∑t(tk+rt)rtk+rzt
由第一个等式,我们得到
(Bk−1)(−1)=z(1+z)k
不妨设 ht=[t(k+1)≤m](m−tkt)。
由刚刚的结果,我们得到,设 n>0,则由拉格朗日反演,
[un]∑tht(−u(1+u)k+1)t=1n[un−1](∑tht(−u)t)′u(uBk+1(u)−1)n=1n∑ttht(−1)t[un−t]B−n(k+1)k+1(u)=∑tht(−1)t(−t(k+1)n−t)=(−1)n∑tht(n+tk−1t(k+1)−1)
考虑到 n∈[1,m],考虑把后半部分视作关于 n 的多项式,进行连续点值求值。
∑tht(n+tk−1t(k+1)−1)=∑t>0ht(t(k+1)−1)!(n+tk−1)t(k+1)−1–––––––––––=∑tht+1((t+1)(k+1)−1)!t∏j=0Pj
然后直接分治 FFT 即可。
最后上一个多点求值,总复杂度 O(mlog2m)。
最后计算出 qU,把其用 ekz 的线性组合表出,再把每个 ekz 用 nn−k 代换即可。
总复杂度 O(mlog2m)。
然后多点求值是常数大头,应当注意实现。
SNOI 取石子
题解
找规律题!
不妨令 n←n−1,从而使得题意变为取走最后一颗石子者胜。
假设使 n 变为先手胜的最小 k 为 an,则
a0=+∞
an=min{k|2k<an−k}(n∈N+)
答案即为 ∑N−1n=1[k≥an]。
乍一眼没思路,考虑打表观察一下数列 a。
n012345678910111213…an+∞12315128123113…
把这里出现的数都列出来,容易发现(除 +∞ 外)只有 1,2,3,5,8,13,正是斐波那契数列!
设 f1=1,f2=2,fm=fm−1+fm−2,则我们不难观察出:
对 n=fm,an=n;对 fm<n<fm+1,an=an−fm。
不难归纳证明。(证明关键:fm+1≤2fm<fm+2)
然后直接做,贪心进行斐波那契拆分,记录每个前缀里每个斐波那契数出现几次即可。
总复杂度 O(Tlog2v) 或 O(log2v+Tlogv) 。
SNOI 水池
题解
非常难受的题目。
把可持久化离线,变为可回退化,写一个可回退化内存池。
可回退化就要求复杂度不能均摊。
容易发现此题可以线段树,考虑具体如何维护。
每个节点维护最大左侧挡板、最大右侧挡板、当前标记状态(无标记 / 区间赋值为 v / 从满的状态变为节点某一侧外的水量降到 v)。
然后直接按题目要求,该二分的二分,操作一通即可。
2019
十二省联考 皮配
题解链接。
十二省联考 希望
题解链接。
ZJOI 麻将
题解
大概就是先建出一个自动机。
然后每读入一个 0∼4 的数据走一步。
最后要使得终状态表示为胡牌。
考虑怎么建。
我们同时考虑七对子和一对子四面子的胡法。
我们把这个东西分开考虑,然后分别作为二维坐标,做笛卡尔积(张量积)即得当前状态。
对于第一类转移,直接记录当前有几个牌满两张了,满七对子就记为七对子,状态数仅为 8。
对于第二类转移,考虑从末尾两项中分别取 a+b,b 张以备后用,然后记录对于每个确定的 a,b,剩下的部分在不要求有对子时最多几个面子,在要求有对子时最多几个面子,显然有 36 种情况,枚举 a,b 取笛卡尔积即得 3615 种状态,直接爆炸。
考虑压缩状态数。
首先如果你要求对子时面子数已经达到 k,则 a+b>4−k 没有意义,直接不记录这一维即可;或者说,强制把 k 改为 4−a−b。
然后从起点 bfs 出可达状态,发现实际可达状态总量很少。
然后直接建自动机就建完了。
接下来就是考虑怎么 dp 了。
考虑直接计算每步的不合法方案数。
然后直接 dp 就好了。
HNOI 白兔之舞
题解链接。
GXOI/GZOI 宝牌一大堆
题解
这就是你对选手的态度?
贪心处理掉七对子和国士无双,考虑 3×4+2 牌型。
首先证明结论:最优解没有杠子。
理由显然:23(43)>24,(43)>1。不如刻子划算。
同样可以强制令不存在一模一样的 3 个及以上的顺子(可以用刻子代替)。
考虑动态规划最优解,然后就没了。
拿了最优解。
GXOI/GZOI 特技飞行
题解
设交点数为 c。
注意到 c≤500000,考虑如何 O(n+c) 找到这些交点。
考虑对起点做扫描线,维护一个终点顺序的数组,y0,i<y0,j 时当且仅当 y1,i>y1,j 才有 i,j 相交。
由于题目保证 y0,i<y0,j⇔i<j,直接顺着扫描过去即可。
c 的贡献可以曼哈顿转切比雪夫然后线段树扫描线直接处理,故接下来考虑 a,b 部分的贡献。
当 b≤a 时,直接全部使用 b 即可。
否则,由于交点总数固定,考虑最大化 a 的出现次数。
由于是“还原”的过程,并且已经有一个解了,考虑网络流调整。
Naive!
考虑把已经有的那个都“拐弯”的解画出来,容易发现,相邻两层的相同节点可以假设有 x 个,则有不超过 2⌊x2⌋ 个可以取 a:把中间的路径全部翻转即可。容易想到这是一个合法上界。
但是是否一定可行呢?其实不一定。因为一层的翻转会导致其余层的点对匹配失败,我们要考虑一些把翻转的信息形式化抽象起来的方法,从而得到解出最优解的方法。
把交点从左向右标号 1∼c,相邻层之间就是一些交点。
对交点也分成 n−1 层,其相邻层交点数之差不超过 1。
如果 i,j 两个交点配对,则 i,j 之间的在相邻层的交点将失效。(已经发生匹配的不影响)
从而,相邻两层的匹配对只会包含或相离。
考虑到如果同一层 i,j,k 均未失效,则不会匹配 i,k。
利用这些特性,在已知上一组情况的情况下,暴力贪心决策当前层是正确的。
即,我们按行的顺序逐个解决贪心,结果是正确的。
但是这个做法还是太 Naive!
由于本题不要求输出方案,把 b 的出现次数直接取 n 减去扫描线得排列的置换数即可,可以证明这是一个下界且总是可取。
GXOI/GZOI 旧词
题解
一眼 「LNOI2014」LCA 啊!
设
vp=depkp−(depp−1)k
即为
∑p≤x∑p,y∈Tqvq
然后即是链带权加链求和,直接离线下来 GBT 维护即可。
总复杂度 O((n+q)logn)。
BJOI 奥术神杖
题解
乘法很毒瘤,考虑取 ln,则变成
∑lnv∑1
考虑二分答案 x,则
∑lnv∑1≥x
∑(lnv−x)≥0
为了避免空集挂掉,不妨扰动一下改成
∑(lnv−x)≥ε
只用最大化左式,考虑在 ACAM 上 dp 转移,单轮复杂度 O(ns|Σ|),总复杂度 O(ns|Σ|logv)。
然后由于这题卡精(实质上是错题,ln 不能乱取,因为难以构造方案),所以要注意实现。
BJOI 勘破神机
题解
考虑设 m∼n 的网格骨牌铺设数为 T(m,n),则
F(n,k)=T(2,n)k––
G(n,k)=T(3,n)k––
于是只用解决
r−1∑i=0(T(m,i)k)(m∈{2,3})
这种形式的问题。
矩阵快速幂没有前途,考虑做的高明一点。
阶乘幂转通常幂采用第一类斯特林数,即
r−1∑i=0T(m,i)k––k!=∑p(−1)k−pk![kp]r−1∑i=0T(m,i)p
第一类斯特林数容易 O(k2) 递推,考虑第二部分。
一种做法是照常枚举前缀。
一种做法是 FKT。
还有一种做法:直接掏出通项!
直接列 GF。
f=11−z−z2
g=1−z21−4z2+z4
然后分别提取系数
[zn]f=(1+√52)n+1−(1−√52)n+1√5
[zn]g=[2|n](1+√3)(2+√3)n/2−(1−√3)(2−√3)n/22√3
对 T(m,n)p,直接二项式展开,然后对次幂分别求前缀和,即可得解。
复杂度不会超过 O(k2logn),实现得好可以更优。(通过观察逆元性质)
SNOI 数论
题解
不妨 P≤Q。
T−1∑k=0[kmodP∈A][kmodQ∈B]=∑x∈A∑kP+x<T[(kP+x)modQ∈B]=∑x∈A∑kP<T−x[(kP+x)modQ∈B]
构造一张点数为 Q 的图,每个点 x 往 (x+P)modQ 连边。
设点 x 走 k 步能到达 x(k),则
∑x[x∈A]∑0≤k≤⌊T−x−1P⌋[x(k)∈B]
把图中每个环都取出,一起处理,预处理前缀和,即可得解。
总复杂度 O(P+Q)。
SNOI 通信
题解
听说是 dp 题,但我不会 dp,所以考虑费用流。
本来感觉过不去,所以打开题解,结果发现费用流居然真能过,这么厉害。
考虑无源汇上下界费用流。
把每个点 p 拆点成 2p 和 2p+1 两个,则考虑这么建网络流图:
- S→2p,流量不超过 1,费用 W。
- 2p→2p+1,流量恰为 1,费用 0。
- 2p+1→2q(p<q),流量不超过 1,费用 |ap−aq|。
- 2p+1→S,流量不超过 1,费用 0。
如果直接按上下界去写,还是太 Naive 了,考虑改求有源汇最小费用流:
- S→2p,流量不超过 1,费用 W。
- 2p→2p+1,流量不超过 1,费用 −A,A=2×109。
- 2p+1→2q(p<q),流量不超过 1,费用 |ap−aq|。
- 2p+1→T,流量不超过 1,费用 0。
显然此时的最小费用流必定流过所有 2p→2p+1,因此不用对其做流量下界限制。
唯一的问题在于,这么网络流建边,总边数是 Θ(n2) 的,经典做法的总复杂度为 O(n4)。
就算卡不满,1000 还是跑不动的,考虑优化。
考虑到只有第三类边的数量是 Θ(n2) 的,考虑如何优化。
如果 ap≥aq,则可以直接用 ap+(−aq) 表示;如果 ap<aq,则可以直接用 (−ap)+aq 表示。
于是对序列进行分治、归并,把归并上来的序列进行前后缀优化建图连边,然后就解完了。
这样的点数、边数都是 O(nlogn) 级别的,使用 SPFA 实现,复杂度 O(n3log2n)。
如果使用 Capacity Scaling 的技巧解决的话,复杂度即为 O(n2log3n)。
不过这题数据玄学,我们也不知道为啥,这题随便做都能过。
SNOI 纸牌
题解
感觉这种计数,一看到,就很 dp 套 dp 啊!
就,感觉就是「ZJOI2019」麻将,的高清重制版呐!
首先,一个牌取 v>6 的可行性,与 v−3 相同;也即,与 (v−4)mod3+4 相同。
因为,如果其有 (i,i,i) 的牌,可以挖掉;如果没有,则有至少 3 个相同的 (i,i+1,i+2) 经过之,可以转化成 (i,i,i) 的情形然后仍然合法。反向推导可以多加一个 (i,i,i) 的匹配。
因此可以理解为,其有 ai 种取 i 张牌的方案,其中 i∈{0,1,2,3,4,5,6}。
这样就可以直接建“胡牌自动机”了。
即,我们记录前面两部分 (i−2,i−1,i),(i−1,i,i+1) 的贡献,经过某种牌时先除去前面两部分的贡献,然后把 (i,i,i) 尽可能多取,剩下的再作为一个 (i,i+1,i+2) 的新的起点;容易证明,任何一个牌的胡态都可以这么表述,且唯一表述。(感觉这么表述好抽象啊,但是想不出更好的描述了)
这样,每个牌型可以描述为一个矩阵,于是可以用矩阵乘法描述。
然后这样子,对相邻的牌之间的部分上矩阵快速幂,就做完了。
粗粗一算,发现每个 i 处 DP 的状态是 3×3=9 种的,所以矩阵都是 9×9 的,做 O(X) 轮快速幂肯定没问题。
使用光速幂不知道效率咋样,不过没有必要。
毕竟不是所有出题人都会跑一遍 BM 的,而且这个矩阵还不大,优化不明显。
然后注意到 unsigned long long
允许我们开下 9×998244352×998244352 的大小,因此可以先求和再取模,大大减小了常数。
设 a=9,总复杂度 O(a3Xlogn)。
然后这个还是太逊了,考虑优化。
考虑倍增预处理 n 以内的矩阵快速幂,然后每次乘向量即可。
总复杂度 O(a3logn+a2Xlogn),可以轻松通过。
然后就是考虑一点科技,高进制快速幂,假设是 B 进制,则为 O((a3B+a2X)logBn)。
取 B=Θ(Xa),复杂度即为 O(a2XlogXan)。
我取了 B=8。
跑得很快,目前是 loj 最优解。
JSOI 神经网络
题解
考虑到路径上会经过很多树,每棵树上经过的一段路径都是一条链(点数 ≥2)或者一个点。
设第 j 颗树有 aj,i 种方法分成总数为 i 的链(点数 ≥2)和点,其中链正反算不同,链、点无序。
然后就转变成了类似于《唱,跳,rap 和篮球》一题。
先考虑如何计算 aj,i 的形式。
每棵树是独立的,考虑分别处理。
考虑树形 dp。
设 fp,i,0/1 表示在 p 所在子树中,已经拼出了 i 个链 / 点,当前节点是否向上连出一条边,已经被考虑的链均被统计了正反两遍的方案数。
则
fp,i,0=∑∑sjs=i−1∏sfs,js,0+2∑∑sjs=i−1∑s0fs0,js0,1∏s≠s0fs,js,0+2∑∑sjs=i−1∑s1<s2fs1,js1,1fs2,js2,1∏s≠s1∧s≠s2fs,js,0
fp,i,1=∑∑sjs=i∏sfs,js,0+∑∑sjs=i∑s0fs0,js0,1∏s≠s0fs,js,0
利用树上背包的技巧优化一下 dp 即可,复杂度 O(k2)。
然后回到 general problem,这又是经典题。
如果允许相邻元素相同,可以把答案描述为
∑{p}(−1+∑jpj)!(∏jaj,pj)
证明显然:枚举每棵树上的部分数目,然后做环排列。
接下来考虑对应单组 {p},求其合法的环排列数。
首先由于是环排列,先钦定起点为 1 号树上 1 所在链 / 点的部分,给环上每个剩余位置以标号;同时也要求起点、终点不可为 1 号树。
然后乘 (p1−1)!∏j>1pj!,转化成插入 pj 个等效元素。
对每个方案进行捆绑法枚举,pj→vj 要乘容斥系数 (−1)pj−vj(pj−1vj−1),j=1 时为 (−1)pj−vj(pjvj)。
然后合并的方案数即为 (−1+∑jvjv1−1,v2,…,vm)。
把容斥系数重组一下即是
(−1+∑jvj)!∏j(−1)pj−vjpj!vj!(pj−1vj−1)
于是答案即为
∑{v}(−1+∑jvj)!∑{p}∏j(−1)pj−vjaj,pjpj!vj!(pj−1vj−1)
看上去是非常恶心的柿子,但是考虑对 v 做背包,然后就完了。
复杂度 O(K2),其中 K=∑k。
然后直觉上,使用 NTT,此题可以做到 O(Klog2K)。
JSOI 节日庆典
题解
考虑怎么不用 Lyndon 分解做。
事实是,加上几个“剪枝”,每个时刻可能作为答案的位置很少。
考虑到,S 的一个前缀 T 的最小表示由 T 的后缀 + 一段前缀描述,
考虑最小化 T 的后缀的字典序。
设每个可能计入答案的 T 的后缀构成的集合是 U,其中最长者为 L。
则对每个 x∈U,x 应是 L 的前缀;否则,要么必然不如 L 优,要么必然吊打 L。
因此对每个 x∈U,x 是 T 的一个后缀,于是也都是 L 的后缀。
也即,都是 L 的 Border!
由 Border 理论,一个串 L 的所有 Border 可以被划分为 O(logn) 个等差数列,其中长度大于一半的就构成等差数列。对于每个 L 的 Border,其与一个 L 的周期互补;小于一半的周期均为最小非 0 周期的倍数。
这样,对每个等差数列,分类讨论容易分析出其只有开头结尾可能匹配答案,直接暴力计算即可。称其为 P,则 |P|=O(logn);比较更优解可用 exkmp 实现 O(1)。
往 T 末尾加入一个字母时,可以在 P 中暴力枚举新的最优 L,从而描述新的 U,P。
这样肯定很难写(要动态维护一个 kmp),考虑能不能用非 Border 理论的方法解决 P 的查找。
方法很简单,直接暴力拿一个 vector
存下当前的集合 P,暴力更新,一旦遇到长度夹在一个更长的长度和其一半之间的元素直接删除即可。
但是我也不会证明这个方法维护是正确的。
其实很容易证明这是正确的,因为这个删除的过程就是在说明某个位置未来永远不会优于另一个位置。未来其也会大于一半,仍为等差数列的一部分,也仍对应一个周期。就算添元素,其也不会更优。
从而解完,总复杂度 O(nlogn)。
值得思考的是,如果强制在线,不能预处理 exkmp,此题是否仍可做到单 log 复杂度或者线性?如果还有删除操作呢?
TJOI 甲苯先生的线段树
题解
对于第一问,就是直接求简单路径,不必多说。
关键是第二问。
考虑怎么做。
我们先求出路径长度,然后就是编号和为定值的简单路径计数。
考虑暴力枚举 LCA 深度,然后枚举左、右子树中路径长度。
设 LCA 编号是 v,把子树中都减去 2depp−deprv,则每层形如从 0 开始的一段数。
对于一条从祖先到子孙的路径,其权值形如 ∑opi(2i−1)。
枚举其中 op 数组中有多少个 1,就是用一个二进制位个数为 k 的数减去 k。
Theorem 1. 记 x 二进制中 1 的个数为 cnt(x),则 x 到根的路径编号和为 2x−cnt(x)。注意这个性质在根为 0 时也成立,只要 x 的儿子还是 2x,2x+1。
Theorem 2. 记路径的编号和为 s,路径的两个端点为 x,y,lca(x,y)=z,x→z 要经过 a 条边,y→z 要经过 b 条边。那么当 a,b,s 都为定值时,z 也必为定值。
咱也不会,只好口胡证明。
Proof for Theorem 1:
考虑归纳证明。
对于根节点,如果是 0/1,显然成立。
对于非根节点 x,假设对 [0/1,x) 都已得证,则其父亲 ⌊x2⌋ 已得证,于是:
若 2∣x,则根到其编号和为 x+(2×x2−cnt(x2))=2x−cnt(x)。
若 2∤x,则根到其编号和为 x+(2×x−12−cnt(⌊x2⌋))=2x−1−cnt(⌊x2⌋)=2x−cnt(x)。
由数学归纳法原理,命题得证。
QED。
Proof for Theorem 2:
考虑先把当前子树编号放缩,逐层变成一段从 0 开始的数。
则得到 s←s−z(∑ai=02i+∑bi=12i)。
我们只要证明此时 s 的值域在 [0,∑ai=02i+∑bi=12i) 内即可;这样 z 就变成了原来的 ⌊s∑ai=02i+∑bi=12i⌋,于是借以证明唯一性。
然后这点是显然的;因为每层编号的值域都是 [0,2i),把层数代入,发现值域在其内,于是就证完了。
QED。
考虑暴力枚举 a,b,显然 a,b∈[0,d),于是就是 O(d2) 的了。
按照刚刚的方法得到 z 后先看层数对不对,不对就直接 pass 了。
如果对的话,考虑按类似最开始的做法,枚举 op 数组中有几个 k,现在就是要看在 [0,2a−1) 与 [0,2b−1) 中有多少二进制位中 1 个数分别为 k1,k2 的数 x,y 满足 x+y=t。
这个是不是直接从低位向高位做一轮数位 dp 就完了?
注意到这个 t 其实只有 O(d) 个,于是只用做 d 轮数位 dp,每轮复杂度 O(d3),总复杂度 O(d4);再算上最外层枚举 a,b,复杂度即为 O(d6)。
506=15625000000,这玩个鬼哦。
希望跑不满。
随便去题解区翻了一圈,都是 O(d5) 的,这是怎么回事呢。
他们也都是数位 dp 啊。
我的状态:k1,k2,nowbit,up。
他们怎么似乎少了一维啊。
怎么回事呢。
看一看。
哦原来不用把 k1,k2 设入状态,直接设 k1+k2 就好了。我是憨憨。
505=312500000
多测,4s,看起来很慌啊。
感觉这个复杂度怎么看都不对啊,可是这就是正解。
应该是常数比较小吧。
SDOI 快速查询
题解
简单题。
观察操作。
1 i val
:将 ai 赋值为给定整数 val;
2 val
:将所有元素同时加上 val;
3 val
:将所有元素同时乘上 val;
4 val
:将所有元素同时赋值为 val;
5 i
:询问第 i 个元素 ai 现在的值是多少;
6
:询问现在所有元素的和。
对 p=107+19 取模,p 是质数。
因此,直接在模域 Zp 下操作即可。
注意到 qt≤107,考虑如何预处理从而 O(1) 操作每个询问。
首先离散化,把特殊元素找出,其余元素应均相同。
考虑维护全局 tag y=kx+b,并同时维护 k−1;时刻保证 k≠0;动态维护全局和。
考虑如何解决全局赋值。
考虑对每个特殊元素维护一个时间戳与元素值 x,如果时间戳和当前时间不同,修改 x=0 并更新时间戳。
这样,每次全局赋值后直接取 k=k−1=1,b=val,并将当前时间自增 1,就实现了惰性全局赋值。
对于全局加,直接对相应标记做修改即可。
对于全局乘,我们先将 val=0 同化为全局赋值。
对于 val≠0,由于本质不同操作个数 q≤105 并且已知,可以离线求逆元;信息合并也是简单的。
对于单点赋值,容易由 y 还原一组合法 x:x=k−1(y−b);信息容易维护。
两种查询于是也都得到维护,于是就完了。
复杂度 O(tq+logMod)
SDOI 染色
题解
这道题目很厉害啊!
考虑暴力 dp:假设已经考虑了前 n 列,最后一列两行分别选了 x,y 的方案数为 An(x,y)。
考虑优化状态。
考虑,若有一列,满足其已被填满,则可分为两个子问题处理,两个子问题之交为此一列。
因此,我们最多考虑左右都是填满的情形;中间不会被填满。
接下来考虑转移。
考虑,我们接下来只用对每个恰填了一项的列 O(c) 状态枚举剩下一项,然后解决如下情形:
∙∘∘⋯∘∙∙∘∘⋯∘∙
从而只有 O(nc) 个状态。
我们不妨更细的对四个 ∙ 合法等价类关系分类成如下七种:
(c,c):a∘∘⋯∘cb∘∘⋯∘d
(c,a):a∘∘⋯∘cb∘∘⋯∘a
(b,a):a∘∘⋯∘bb∘∘⋯∘a
(a,c):a∘∘⋯∘ab∘∘⋯∘c
(a,b):a∘∘⋯∘ab∘∘⋯∘b
(b,c):a∘∘⋯∘bb∘∘⋯∘c
(c,b):a∘∘⋯∘cb∘∘⋯∘b
考虑中间填法数,显然可以预处理;假设中间有 m 项,方案数分别为 fm,1/2/3/4/5/6/7。
接下来就是巨大分类讨论。
容易分析出
fm,1=⎧⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪⎩1(m=0)(c2−7c+13)fm−1,1+(c−3)fm−1,2+fm−1,3+(c−3)fm−1,4+fm−1,5+(c−3)fm−1,6+(c−3)fm−1,7(m>0)
fm,2=⎧⎪⎨⎪⎩1(m=0)(c2−6c+9)fm−1,1+(c−2)fm−1,4+fm−1,5+(c−2)fm−1,6+(c−3)fm−1,7(m>0)
fm,3=⎧⎪⎨⎪⎩1(m=0)(c2−5c+6)fm−1,1+(c−2)fm−1,4+fm−1,5+(c−2)fm−1,7(m>0)
fm,4=⎧⎪⎨⎪⎩0(m=0)(c2−6c+9)fm−1,1+(c−2)fm−1,2+fm−1,3+(c−3)fm−1,6+(c−2)fm−1,7(m>0)
fm,5=⎧⎪⎨⎪⎩0(m=0)(c2−5c+6)fm−1,1+(c−2)fm−1,2+fm−1,3+(c−2)fm−1,6(m>0)
然后
fm,6=fm,2,fm,7=fm,4
然后前面的相应转化一下
fm,1=⎧⎪⎨⎪⎩1(m=0)(c2−7c+13)fm−1,1+(2c−6)fm−1,2+fm−1,3+(2c−6)fm−1,4+fm−1,5(m>0)
fm,2=⎧⎪⎨⎪⎩1(m=0)(c2−6c+9)fm−1,1+(c−2)fm−1,2+(2c−5)fm−1,4+fm−1,5(m>0)
fm,3={1(m=0)(c2−5c+6)fm−1,1+(2c−4)fm−1,4+fm−1,5(m>0)
fm,4=⎧⎪⎨⎪⎩0(m=0)(c2−6c+9)fm−1,1+(2c−5)fm−1,2+fm−1,3+(c−2)fm−1,4(m>0)
fm,5={0(m=0)(c2−5c+6)fm−1,1+(2c−4)fm−1,2+fm−1,3(m>0)
按着这个直接 dp 预处理。
除此之外,对于两端的结果也要 dp,为
gm=[m=0]+[m>0](c2−3c+3)gm−1
dp 的过程可以用《快速查询》的数据结构快速维护,然后完了。
SDOI 世界地图
题解
考虑 LCT 维护前后缀最小生成森林,然后合并答案。
注意到真正“在合并时有用的信息”,是中间合并时,在加入 n 条边时,对“删除哪些边”的查询。
这些查询可能涉及到的边有:合并时新加的边;原本相邻两个点的在 MST 上的瓶颈边。
考虑直接对合并端相邻点分别建虚树维护,问题是动态树上虚树如何快速找出。
似乎很困难啊!
这个东西,我只能做到 2log,常数巨大肯定过不去。(Update:使用 access 提取路径可以做到单 log)
考虑不写出显式的 LCT,而只维护虚树。
维护每个前缀的由最左点、最右点构成的点集对应的虚树,点数 O(n),显然是可以“递推”的——直接重新跑 MST 建虚树即可。
后缀同理。
然后合并信息时也这么干,复杂度 O(nmlogn+nqlogn),可以通过。
使用基排、更优的并查集可以做到更优复杂度。
TBA
题解
可能不会更了,咕咕咕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫