AT VP 记录
AGC049
A
简单题,考虑一个点 \(u\) 如果要做贡献就需要能够到它的点都没有在它之前被选。要求其概率很简单,我们不考虑选择的点不在当前考虑集合中的情况,这一次选择了这个集合中的点,那么一定要是 \(u\),于是概率就是 \(1\over|S|\)。你一个传递闭包就做完了。
B
贪心题,类似 NOIP2024T1。所以为啥我今天思考 1min,写了 5min 但是 24 年考场上却因为 T1 爆了呢?
C
考虑一个点不合法的条件是 \(a_i\le b_i\)。对于合法的点我们当作一个区间 \([a_i-b_i,a_i]\),如果不合法的点在区间中那么我们不用考虑。现在我们只需要去寻找最优的方案让不合法的点被覆盖或者合法,这里分别有一种调整方法。
如果我们要让一个点合法,那么我们会一直减少区间长度。当它合法的时候就一定会变成一个前缀区间。如果我们想让一个点被覆盖,一定会找到它右边第一个合法的位置新建区间。并且我们将两种做法结合的时候一定是将一操作中减少的添加到二操作中增加的地方。考虑最优操作一定合法,所以我们统计不合法的操作情况一定不优,但是这样能少很多分讨。
注意到如果我们最多只会进行一次二操作,不然显然可以将操作靠前的去掉,这样一定更优。所以我们就枚举在哪里用了二操作即可。
D
如果不考虑其他条件就是一个普通的背包,用生成函数优化一下即可。现在有那个限制我们考虑根据限制找性质。\(2A_i\le A_{i-1}+A_{i+1}\Rightarrow A_i-A_{i-1}\le A_{i+1}-Ai\),于是我们知道了这是一个凹函数。到这里有一个很关键的观察,笔者赛时因为没有注意到于是没场切。考虑设差分数组 \(D_{i}=A_i-A_{i-1}\),可以发现 \(D\) 在首尾两端非零的个数只有 \(\sqrt m\) 个,剩下的中间位置全为 0。
知道这个我们就好做了。考虑暴力跑背包做出前后缀,然后拼到一起即可。
AGC052
A
唐题。考虑在前半部分取 n 个 0 然后紧接着取 n 个 1 后一定还能取 0,证明显然。
B
疑似脑筋急转弯,但是需要你有意识。考虑到这个题是边权,不好做,于是我们考虑转到点上面。然后就做完了。具体的,考虑转到点上后一个点的权值就是从根一直异或到这个点。现在考虑一次操作的影响,发现就是交换两个点的权值,因为其他地方都被抵消了。非常神奇!注意如果根与其他点发生交换会对全局产生影响,因为我们钦定根的权值为 0。于是我们在比较两个点权集合之前需要找到整体异或的值。因为有:
又因为 n 是奇数,所以能够解出 x 然后就开 map 比较即可。
C
首先一个好的数组,所有元素的和不能是 \(P\) 的倍数。考虑一个合法的填数过程,我们肯定可以先一直填 1,当遇到前缀和取模后等于 \(P-1\) 的时候我们就不能填 1 了,于是就去填其他数。那么我们可以假设 1 是众数,考虑如果实际众数不是 1 的时候,我们可以在取模的意义下对所有数乘上众数的逆元,这样就能等价于现在的问题。弱化问题后我们尝试寻找合法数列的充要条件。下面直接给出条件:假设有 \(n-m\) 个 1,其余数分别为 \(B_i\),那么有解的充要条件是
我们接下来简单证明一下。首先必要性显然,我们考虑化简式子能够得到 \(\sum A_i<P(m+1)\),若 \(\sum A_i\ge P(m+1)\) 那么我们填 1 直到模数为 \(P-1\) 的时候就会出现 \(m+1\) 次,分别在 \(\sum=kp-1,k\in[0,m+1]\) 的时候会遇到,但是大于 1 的数只有 \(m\) 个所以寄了,于是得证。
对于充分性,我们可以考虑一种构造方法,设 \(x\) 是当前众数,如果有 \(\sum+x\not\equiv0\pmod P\) 那么无需()(),否则我们需要换一个元素填入。这个算法显然不会寄,因为如果已经寄了那么它一定连最开始的条件都不能满足于是直接被判掉了。然后有一个比较重要的观察:填数过程中,如果一个数是众数,那么之后它的个数不会比众数的个数少超过 1 于是得证。
我们考虑计数。大体思路是简单容斥,先求出满足 \(\sum\neq kP\) 的数列然后减去上面限制不合法的。对于前者我们可以简单递推,后者考虑 dp,设 \(f_{i,j}\) 表示考虑前 \(i\) 个不为 1 的数 \(\sum_{k\le i}(P-B_k)=j\) 的方案数,背包即可做到 \(\mathcal O(n^3)\),前缀和优化可以做到 \(\mathcal O(n^2)\)。
D
不困难题。考虑先求出原序列的 LIS,设 \(f_i\) 表示以 \(i\) 结尾的 LIS 最长长度,最后求出的答案设为 \(m\)。如果 \(m\) 为偶数那么我们考虑将所有 \(f\le {m\over2}\) 的分为一组,剩下的在另一组即可。现在考虑奇数的情况。我们假设现在找到了一个长为 \(m=2k+1\) 的序列,现在我们再去外置位找一个 \(x\) 满足 \(x\) 属于一个长度为 \(k+1\) 的序列。现在考虑将此序列放入第一组,设 \(F\) 表示选择数列除了 \(x\) 以外的位置的 \(f\) 构成的集合。对于剩下的位置,如果有 \(f_i\in F\) 那么分到第一组,否则分到第二组。
考虑正确性。第一组的 \(f\) 取值只有 \(k+1\) 种,并且已经有一个长度为 \(k+1\) 的子序列;第二组考虑原来的最长的 LIS,这个序列里面有 \(2k+1\) 个元素,但是现在有 \(k\) 个元素去了第一组,还剩 \(k+1\) 个元素刚好满足条件。对于其他的数不能组成更长的 LIS,故得证。
转化成判定条件就是如果 \(m\) 为偶数那么一定行,否则我们就需要在原来最长的 LIS 以外的位置找到一个位置满足其属于一个长度为 \(k+1\) 的 LIS,我们考虑正反做两个 dp 得到一个位置最长属于多长的 LIS,如果合法的位置有 \(\ge 2k+1\) 个那么我们在除开原本最长的 LIS 后还能有至少一个位置可选择,于是就合法了,否则不合法。
E
我们对 ABC 进行编码,令其分别代表 012,现在我们考虑用数学方式去刻画合法序列。我们意识到,相邻字母只要不同,转换为数值后模 3 的差一定是 1 或 -1,于是我们考虑对序列给出一些约束:
- \(|A_{i+1}-A_i|=1\)
- \(A_i\equiv S_i\pmod3\)
我们把这样的序列称作好的。可以发现,若固定 \(S\) 与 \(A_1\) 后整个好序列唯一确定。如果 \(A_1\) 不固定好序列不唯一,但是都能对应到一个 \(S\) 上。现在我们考虑一次变化的情况,一定是一个位置 +2 或者 -2,因为如果一个位置相邻的颜色不同一定不能变,否则就能用 +2/-2 来表示,于是我们知道了首先 \(A\) 和 \(B\) 的奇偶性必须要相同。因为好序列可以同步平移,所以我们实际只需要满足 \(A_1\) 和 \(B_1\) 的奇偶性相同即可。现在我们考虑一个固定的 \(A\) 和 \(B\) 的答案。现在显然有一个答案的下界:\(\sum|a_i-b_i|\over2\)。猜测并考虑证明这就是答案。那我们断言存在一种策略能保证每一步都能让它减少一。换句话说,每一步一定会找到一个 \(A_i>B_i\) 的位置进行 -2 操作,另一种情况同理。我们考虑在 \(A_i>B_i\) 中找到 \(A_i\) 最大的地方,考虑证明相邻的位置的 \(A=A_i-1\)。我们可以用反证法,证明,具体可见题解。
这个东西证完后差不多就做完了,考虑现在确定 \(A\) 和 \(B\)。我们注意到现在需要满足两个条件就是 \(A_1\) 和 \(B_1\) 的奇偶性相同还有 \(A\) 或者 \(B\) 可以任意 +3/-3,于是对于一个已知的 \(S\) 和 \(T\) 我们能先钦定一个 \(A\),然后通过 \(A\) 构造一个 \(B\)。注意我们的答案是 \(\sum|a_i-b_i|\over2\),所以我们可以在绝对值里面进行全局若干次 +6/-6 使得总和最小。显然我们让中位数尽量为 0 更优,于是找到能让中位数尽量为 0 的 6k 然后在其周围几个取值都计算一下取最小值即可。
AGC054
A
如果两头不同那么答案为 1,否则我们就去寻找一个位置 \(i\) 满足 \(a_1\neq a_i\) 且 \(a_{i+1}\neq a_n\)。如果有那么答案为 2 否则无解。
B
假设我们已经确定了两个人分别选择的物品排列,那么我们把两个序列组合到一起一定能唯一对应一个原来的排列,因为要保证题目的限制。于是我们就可以直接背包,设 \(f_{i,j,k}\) 表示考虑前 \(i\) 个物品,第一个人选了 \(j\) 个得到体积为 \(k\) 的方案数。最后枚举一下选择的物品数量乘上排列数即可。
C
注意到如果一个位置限制小于 \(K\) 就不会对答案有影响,因为操作是贪心的,说明一个不合法的数最后一定是限制刚好为 \(K\) 才最优。然后考虑一个数如果限制炸了肯定需要往前交换,反过来就是往后交换。于是我们树状数组维护每个位置的限制(逆序对数)然后乘法原理即可。
D
先不考虑字母的影响,如果只有括号那么问题是容易处理的。我们直接从左到右扫一遍,把左括号看成 +1 右括号看成 -1 然后维护前缀和即可。当前缀和小于 0 的时候我们需要从后面拿一个左括号匹配多出来的右括号,直接暴力即可。时间复杂度 \(\mathcal O(n^2)\)。现在我们再来考虑加入字母的影响。
对于 o 我们把它当成占位符即可,对于 x 我们需要用一对括号把它围起来。考虑字母之间的相对顺序是不变的,如果变了一定不优。具体的,首先我们不会有 xo 到 ox 的情况;然后就是会存在类似于 ()ox 到 (x)o 的情况,对于这种我们可以固定字母只移动括号,所以变成 (ox) 是等价的。于是问题就变成了归并两个序列,并且两个序列对应在原序列有一个位置要求满足条件的情况下最少的交换次数。
于是我们可以对两个序列考虑其在原序列的位置,每次归并一个新的位置的交换次数就是这个位置和另一个序列一段前缀的逆序对数,预处理出来然后 dp 即可。
E
先考虑钦定 \(a_1<a_n\),否则可以令 \(x=n-x+1\) 从而满足前面的限制。对这种神秘的排列计数考虑寻找充要条件刻画,因此我们应该去思考一个排列能够一直删到只剩两个元素的充要条件。这里直接给出充要条件:存在 \(i\) 使得 \(a_i<a_1<a_n<a_{i+1}\)。
考虑充分性:我们先把能删的全删了但是保留位置 \(i\) 和 \(i+1\),此时我们会把序列删成两个单调递减的数列,然后从中间往两头删即可构造出一种合法方案。
考虑必要性:我们可以通过归纳法证明。基本情况是 \(n=3\) 的时候一定成立,考虑当前已经知道 \(n-1\) 时成立,考虑 \(n\)。如果我们当前能删得只剩两个数但是不存在 \(a_i<a_1<a_n<a_{i+1}\),那么我进行一次删除后会出现这个条件。考虑有 \(a_i<a_1<a_n<a_{i+2}\),我们删掉的是 \(a_{i+1}\),如果 \(a_1<a_{i+1}<a_n\) 那么这个位置不能被删掉,否则就会出现位置 \(i\) 或者 \(i+1\) 在最开始就已经满足条件。于是得证。
现在我们可以考虑计数了,因为存在不好计数所以我们容斥一下考虑统计不合法的情况。这个等价于 \([1,a_1]\) 的元素后面不能是 \([a_n,n]\)。设 \(a_n=a_1+k=x+k\)。对于 \((a_1,a_n)\) 的数我们可以随便填,方案数是 \((k-1)!\)。然后考虑 \([1,a_1)\) 的数,最开始有 \(k-1\) 个位置,每次插入都会有一个新的位置可供插入,于是第 \(i\) 次插入的方案是 \(k+i-2\);最后考虑 \((a_n,n]\) 的数,和上一种同理,考虑有一个 \([1,a_1]\) 的元素后面不能是 \([a_n,n]\) 的限制,于是初始可选择的位置是一样的。然后就有式子了:
总的答案再在外面套一个和式,然后限制考虑化简。我们可以手动把上升幂补成组合数的形式然后化简,后面就是上指标求和。
最后有:
再次化简得到:
两种情况每次查询可 \(\mathcal O(1)\) 计算。
AGC057
A
可以注意到用位数少的一定不优,因为其向外拓展的方式更多导致不能用的数也越多。所以我们肯定先选择位数最多的,然后考虑剩下的还有哪些可以选。假设 \(r\) 的位数为 \(k\),考虑 \([\max(10^{k-1},l),r]\) 都可以选。现在我们要处理位数更少的情况。考虑 \(r\) 的最高位,如果大于 1 那么说明长度为 \(k-1\) 的所有串已经全部被包含就不管了,否则就需要管。考虑 \(r\) 对长度为 \(k-1\) 的串的限制一定是一段前缀,于是找到右端点即可。
B
对于一些神秘题我们考虑先从简单情况入手。我们考虑两个数 \(x,y\) 怎么做。如果 \(x<<y\) 那么我们一定是先让 \(x\) 变大;如果 \(x<y<2x\) 那么考虑令 \(d=y-x\),如果 \(d<k\) 那么通过一定的操作我们能够让两者相同,否则每次的差距只会越来越大,所以不操作最优。我们考虑将 \(x\) 扩展能够得到 \([2x,2x+k]\),每次都是一段区间。如果区间能够包含 \(y\) 那么就没有贡献,否则我们肯定是找到 \(y\) 前面区间的右端点和后面区间的左端点进行选择最优。
对于多个数的情况考虑一个特殊的数,也就是序列最大值,假设叫 \(t\)。如果我们最后得到的序列 \(x\) 被操作了 \(q\) 次,那么其他数起码都要操作 \(q\) 次。证明考虑如果再条一步一定会离 \(t'\) 更近。所以我们可以让 \(t\) 固定,去考虑剩下的数。因为 \(t\) 固定了,所以我们肯定是让其他数尽量靠近它才更优。于是就变成了若干上面两个数的问题,只不过现在对于一个数我们有两种选择,要么选前面区间的右端点 \(lp_i\),要么选后面区间的左端点 \(rp_i\),最后要让选出的数极差最小。这个问题我们可以按 \(lp_i\) 排序,然后我们去考虑答案区间左端点的位置。假设是 \(lp_i\),那么对于 \(i+1\) 到 \(n-1\) 的数我们选 \(lp\) 一定不劣,剩下的一定会选 \(rp\),于是我们维护一个前缀 \(rp\) 最大值即可。
C
先考虑判无解,设 \(m=2^{n-1}\),则一个排列能还原的一个必要条件是 \(p_i\equiv p_{i+m}\pmod{m}\)。证明考虑最终状态下一定是满足条件的,然后就是因为只有异或和 +1 操作,所以这个条件始终成立。
先考虑简单的情况,如果 \(\forall i\in[0,m),p_i\) 的最高位都是 0,那我们直接异或一个 \(p_0\) 就做完了。那如果不为零,我们就想去把它们全都变成零。从左到右考虑 \([0,m)\) 的每个位置,考虑怎么操作才没有后效性?若当前考虑到了 \(i\),前面 \([0,i)\) 的最高位都变成了零,当前是 1,我们考虑用一些 +1 和异或把 1 变成 0 并且不影响其他位置的最高位。首先如果一直 +1 显然不行,所以我们最开始考虑异或。但是如果我们最高位异或上 1 那不就废了吗?这里我们可以先把 \(p_i\) 异或成 \(2^n-1\),这样我们最高位异或上了一个零不会对其他地方有影响,然后我们全局 +1。这时候 \(p_i\) 会变成 0,考虑其他位置若是要最高位变成 1 那一定会产生进位。如果一个 \(p_j\) 要进位那么有 \(p_j=m-1\),但是考虑我们的 \(p_i=2^n-1\),那么就有 \(p_{i+m}=m-1\),于是这样操作永远不会进位。并且这样操作次数不超过 \(2^n+1\),非常优秀。
具体维护可以使用 01trie,时间复杂度 \(\mathcal O(n2^n)\)。
D
首先我们要找到合法数列的上界,其次考虑如何做使得字典序最小。考虑若干形如 \((i,S-i)\) 的数对,显然这里面最多只能选择一个,如果两个都选那么就能凑出 \(S\) 了,所以答案的上界为 \(\left\lfloor S-1\over2\right\rfloor\)。现在我们考虑简化问题,我们其实可以通过确定一个合法的集合 \(B\) 满足 \(\forall x\in A,x\le\left\lfloor S-1\over2\right\rfloor\),据此确定 \(A\)。考虑对于之前的数对 \((x,y),x<y\),若 \(x\notin B\),那么有 \(y\in A\),否则有 \(x\in B\subseteq A\)。现在我们尝试去寻找字典序最小的 \(B\),显然若 \(B\) 满足字典序最小则有 \(A\) 同样满足字典序最小。
在开始前我们先来证明一个引理。
引理:若 \(a,b\in B,a+b\le\left\lfloor S-1\over2\right\rfloor\),则 \(a+b\in B\)。
证明考虑反证法。如果 \(a+b\notin B\),那那么有 \(S-a-b\in A\),于是 \(A\) 中的元素就能够凑出 \(S\) 了。矛盾。
首先我们要明确一点,就是我们从小到大去考虑 \(i\le\left\lfloor S-1\over2\right\rfloor\),如果 \(i\) 能被选择那么我一定会去选它。这里会有一个问题,就是说为啥这样构造出来的 \(B\) 对应的 \(A\) 一定合法呢?考虑反证法,首先 \(B\) 一定合法,若 \(A\) 不合法,那么一定存在一个 \(x>\left\lfloor S-1\over2\right\rfloor\) 能与若干 \(y\in B\) 凑出 \(S\)。因为对于形如 \((i,S-i)\) 的数对只能选择一个数,所以 \(S-x\notin B\)。但是因为有若干 \(y\in B\) 能够凑出 \(S-x\),根据引理有 \(S-x\in B\),所以矛盾。这样就说明了做法的正确性。
接下来我们考虑会加入什么数以及加入的数有什么性质。假设现在 \(x\) 能加入 \(B\),那么对于 \(\forall y=kx,y\le\left\lfloor S-1\over2\right\rfloor\) 一定也能加入 \(B\)。如果原来集合里有 \(x\),我们加入 \(y\),那么对于 \(\forall v=k1x+k2y,v\le\left\lfloor S-1\over2\right\rfloor\) 一定也能加入 \(B\)。这显然可以考虑同余最短路。
考虑最短路之前我们需要找到最小的 \(x\in B\),考虑找到最小的 \(x\not\mid S\)。因为 \(\text{lcm}(1,2,\dots,x-1)\mid S\),所以能算出 \(x\le43\),设为 \(p\)。然后就正常同余最短路做即可。
具体的,我们设 \(f_i\) 表示 \(B\) 中元素能组合出最小的 \(x\bmod p=i\) 的数,加入一个 \(x\) 就有 \(f_{i}\leftarrow f_{(i-kx)\bmod S}+kx\),你写成转两圈的形式会好写一些。一个元素加入后合法当且仅当 \(f_{S\bmod p}>S\),结合 dp 转移式有 \(\forall i,x>\left\lfloor S-f_{(S-ix)\bmod p}\over i\right\rfloor\)。到此这个题差不多就做完了,求答案考虑二分,若要求 \(B\) 中 \(\le k\) 的元素个数,则有 \(\sum\limits_{i=0}^{p-1}\left\lfloor k-f_i\over p\right\rfloor+[i>0]\)。时间复杂度 \(\mathcal O(p^3+p\log n)\)。
E
困难题,花费大量时间才会。
注意到值域很小,我们考虑从此入手。假设现在只有 01 两种数,那么我们对一个 \(A\) 进行操作后会是什么样子?如果是先行后列,相当于我们对每一行按 0 的数量降序排序且把 0 放在每行最前面;如果是先列后行,相当于我们对每一列按 0 的数量降序排序且把 0 放在每行最前面。 一个 \(A\) 合法,肯定需要让其行和列分别构成的可重集相等,并且 \(A\) 的可重集和 \(B\) 的可重集也一定是相等的。说明我们对 \(B\) 进行一些行或列的交换能够得到 \(A\)。我们刻画一下这个东西,相当于如果一个 \(A\) 合法,当且仅当存在两个排列 \(p,q\),满足 \(\forall i,j,A_{i,j}=B_{p_i,q_j}\)。这个东西的数量就是两个可重集的排列数相乘:
现在考虑拓展。对于值域 \([0,9]\) 的时候我们还是先思考如何判断合法。注意到值域很小,于是我们考虑枚举值域,设当前枚举到 \(i\),那么我们将所有小于等于 \(i\) 的看成 0,否则看成 1,然后去判断 01 矩阵是否合法。如果每个 \(i\) 都合法那么这个矩阵合法。我们还是考虑刻画这个条件,相当于是存在一组排列 \((p_0,q_0,p_1,q_1,\dots,p_9,q_9)\),满足 \([A_{i,j}\le k]=\forall i,j,k,[B_{p_{k,i},q_{k,j}}\le k]\)。这个条件必要性显然,考虑充分性。就是说我们在考虑枚举值域 \(i\) 的时候,相当于在前面枚举 \(i-1\) 的基础上将变化的位置填上 \(i\)。这样填肯定是能对应一个合法的 \(A\) 的。于是现在我们就去考虑满足条件的排列组数,然后去掉重复的方案数。
直接做是困难的,我们考虑将每个条件独立。现在有 \(B_{p_{k,i},q_{k,j}}\le k\rightarrow B_{p_{k+1,i},q_{k+1,j}}\le k+1\),为了让每个枚举的 \(k\) 独立出来,我们考虑去计数更好做的。本来我们每次的排列 \((p_k,q_k)\) 是在 \((p_{k-1},q_{k-1})\) 的基础上得到的,现在我们考虑定义一个 \(p'_k={p_k\over p_{k-1}}\),然后拿 \(p'_k\) 去限制,这样就把每个 \(k\) 独立出来了。现在的条件就变成了 \(B_{i,j}\le k\rightarrow B_{p'_{k,i},q'_{k,j}}\le k+1\)。
注意到 \(B\) 中 \(\le k\) 的部分是杨表,所以一个位置小于一个数的条件可以简化。设 \(a_i\) 表示 \(B\) 的第 \(i\) 行最后一个 \(\le k\) 的位置,\(b_j\) 表示第 \(j\) 列最后一个 \(\le k\) 的位置。现在我们就能将前面的条件继续转化:\(\forall j\le a_i,p'_i\le b_{q'_j}\)。考虑到 \(b\) 递减,所以当 \(q'_j\) 取最大值时限制最严,然后限制就变成了 \(p'_i\le b_{\max\limits_{j=1}^{a_i}q'_j}\)。我们令下面那一坨等于 \(c_i\),如果我们知道了 \(c_i\) 就能对 \(p',q'\) 计数。
考虑 \(p'\)。因为 \(a_i\) 递减,所以 \(c_i\) 递减,\(b_{c_i}\) 递增。于是 \(p'\) 的个数就是 \(\prod\limits_{i=1}^nb_{c_i}-i+1\)。考虑 \(q'\)。如果有 \(c_i=c_{i-1}\) 说明 \((a_{i},a_{i-1}]\) 中没有最大值,考虑区间内选第一个数答案是 \(c_i-1-(a_i-1)=c_i-a_i\),后面依次少一。如果里面有最大值,考虑每个位置出现最大值是等价的,于是多乘一个 \(a_{i-1}-a_i\) 即可,因为剩下的就等价于没有最大值的填法。
对于这个东西我们就可以考虑 dp 了,设 \(f_{i,j}\) 表示前 \(i\) 个数,\(c_i=j\) 的方案数。转移就按照上面说的做即可,注意转移的贡献与 \(j\) 无关,于是考虑后缀和优化一下即可。时间复杂度 \(\mathcal O(nmV)\)。
F
一道挺有意思的计数题,自己看洛谷题解不是很懂,max 讲了然后自己去看 AT 的题解就很易懂了。是好题,值得做!
首先我们可以换一种三元组的表达方式,考虑记录 \((x,a,b)\) 表示中间的点是 \(x\),其两边分别间隔 \(a,b\)。考虑变化的过程,若钦定 \(a<b\) 那么有 \((x,a,b)\to(x+a,a,b-a)\) 和 \((x,a,b)\to(x-a,b-a,a)\)。我们考虑换一种更简洁清晰的表达方式,这里我使用了 AT 的图片:

这里我们省略了 \(x\) 仅保留 \((a,b)\),然后将两种转化看成两条边,边权就是 \(x\) 的变化量。于是我们统计不同的 \((x,a,b)\) 就变成了统计从根到图上每个点的路径数,可以发现两者恰好构成双射。进一步思考,一条边上有边权,那么对于一条从根开始的路径一定对应一个边权和。那么要统计到一个点的不同路径数,就相当于是统计边权和的情况数。计数的时候需要考虑不重不漏,所以我们需要找到一种合理的统计方式,在此之前我们可以先寻找图的性质。
我们设 \(a_i\) 表示第 \(i\) 次变化时中间的点的移动距离,也就是 \(a_i\) 代表第 \(i\) 列的边的边权的绝对值。考虑这个序列一种生成方式是在做辗转相减法的过程中记录较小的数,所以可以从这方面入手寻找性质。注意到在辗转相减的过程中我们会在某段时间减去相同的值,于是考虑把 \(a_i\) 划分成 \(\mathcal O(\log V)\) 个段。假设共有 \(m\) 段,对于第 \(i\) 段,我们假设有 \(c_i\) 个 \(b_i\),现在我们在 \(b_i\) 上考虑。
这里有一个非常重要并且巧妙的性质:\(b_i=c_{i+1}\times b_{i+1}+b_{i+2}(i\le m-2)\),就比如上图中有 \(7=2\times3+1\)。等式成立的原因可以考虑用辗转相除法优化辗转相减法的时候,有 \((a,b)\to (b,a\bmod b)\),这其实就是一个被除数 \(=\) 除数 \(\times\) 商 \(+\) 余数的等式。注意这个性质在最后其实并不成立,因为最后一段的 1 全选就能凑出上一段的数,于是我们考虑手动去掉一个 1 保持性质。有了这个重要的性质之后现在考虑计数,我们先翻译一下这个结论,把它变成能够直接用的:选择了一个 \(b_i\) 等价于选择了整段的 \(b_{i+1}\) 以及一个 \(b_{i+2}\)。
那么我们考虑将所有的后者换成前者。当后者不能换成前者的时候说明第 \(i\) 段已经全选了,以此类推,前 \(i\) 段也已经全选了。说明我们一种边权和可以看成这样一种选择方案:选择了一个前缀 \(i\) 满足第一段一直到第 \(i\) 的所有数都已经全选,后面还有若干的 \(b_j\) 被选择,但是如果选择了整段的 \(b_j\) 就不能选择 \(b_{j+1}\)。
刻画出了选择方式我们就可以对此 dp 了。设 \(f_{i,0/1}\) 表示考虑到了第 \(i\) 段,在前缀全选的段不足 \(i\) 的情况下这个段是否全选。转移是简单的,但这里还是负责任地讲一下。对于 \(f_{i,0}\),考虑这一段从哪个状态转移,并且这一段选多少个数。于是有 \(f_{i,0}=f_{i-1,1}+c_i\times(f_{i-1,0}+1)\)。考虑如果上一段全选那么这一段不能选数;如果上一段不是全选那这一段可以选 \([0,c_i-1]\) 个数;如果全选的前缀是 \(i\) 那么这一段能选 \([0,c_i-1]\) 个数。对于 \(f_{i,1}\) 有 \(f_{i,1}=f_{i-1,0}\),这是显然的。
最后我们考虑统计答案。对于一段的贡献一起统计,设 \(s_i\) 表示第 \(i\) 段的答案。考虑一个段 \(i\) 最后一个位置 \(j\) 的答案为 \(f_{j,0}+f_{j,1}+1\),但是一个段中不同的位置其 \(f_{j,0}\) 是不同的,因为 \(f_{j,0}\) 与这个段的前缀长度有关。什么意思呢?就是说假设位置 \(j\) 是第 \(i\) 段的第 \(k\) 个位置,我们转移 \(f_{j,0}\) 的时候这个段能够选择的数其实只有 \([0,k-1]\),所以一个段中的 \(f_{j,0}\) 略有不同,于是统计一个段的答案的时候就不能直接写 \(c_i\times(f_{i,0}+f_{i,1}+1)\),而是去枚举段中的每个数,有:
把 \(j\) 提出来化简即可。考虑最后的答案之和,根据上图,注意到除了最后一个段其他都有两个点,然后你还要考虑不做任何操作以及开头还有两个选择,并且前面去掉的那个 1 最后还会有贡献需要加回去,于是答案为 \(3+\left(\sum_{i=1}^{m}2s_i\right)-2s_{m-2}-s_{m-1}\)。最后时间复杂度为 \(\mathcal O(q\log (c-a)\))。

浙公网安备 33010602011771号