Loading

省队集训day9day10

省队集训day9&day10

考试

T1

对于一棵树,答案为 \(\sum\limits_{u}2^{dep_u}\),(枚举终点,其先可以任选任意一个子集。)我们考虑如何维护。显然,我们可以预处理出 \(S_u\) 表示 \(S\)\(u\) 这颗子树表示的答案。记 \(f_u\) 表示标记为 \(u\)\(2^{dep}\) 次方之和,那么答案就是 \(f_u\) 之和。如果进行一次 \((u,v)\) 操作,总答案会加上 \(2f_u\times S_v\) ,并且在 \(S\)\(v\) 子树的每一个点 \(w\)\(f_w\) 都会增加 \(2f_u\times 2^{dep_w-dep_v}\)

\(g_u=\frac{f_u}{2^{dep_u}}\),那么子树内所有的 \(g_w\) 都会增加 \(\frac{2f_u}{2^{dep_v}}\) ,用数据结构维护就可以了,时间复杂度可以做到 \(O(n+(n+q)\log m)\)

T2 CF232E

考虑分治,我们实现用 solve(l,r) 去求 \(1\le x_1\le x_2\le r\) 的问题的答案。对于所有 \(x_1\le mid \le x_2\) 的问题,我们在这里回答,其他问题向左右递归回答。

\(f_{x,y}\) 为从 \((x,y)\) 开始往右下走能走到的形如 \((mid,i)\) 的点的集合,\(g_{x,y}\) 代表往左上走能走到的形如 \((mid,i)\) 的点的集合,那么这个东西可以用 bitset 在 \(O(\frac{(r-l)n^2}{w})\) 的时间内做出来。于是 \((x_1,y_1)\) 能走到 \((x_2,y_2)\) 当且仅当 \(f_{x_1,y_1}\)\(g_{x_2,y_2}\) 有公共元素。

T3

\(p_{u,v}\) 代表在选择 \(u\) 进行划分时,\(uv\) 联通的概率。那么 \(\sum\limits_{u=1}^n\sum\limits _{v=1}^np_{u,v}\) 就是答案。所以在做这个题时,我们先找出环,我们考虑直接枚举 \(u,v\) ,那么可以分情况讨论。

  • 如果它们在环上同一个点伸展出的数内,那么只有当 \(u,v\) 路径上的点钟第一个选了 \(u\) 才行,所以为 \(\frac{1}{len}\)
  • 否则 ,两点间有两条路径,用两条路径分别第一个选 \(u\) 的概率减去两条路径的并还是第一个选 \(u\) 的概率:\(\frac 1 {len_1}+\frac 1 {len_2}-\frac 1{len_3}\) ,其中 \(len_3\) 是这两条路径并起来的长度。
  • 总的时间复杂度为 \(O(n^2\log n)\) ,如果使用 \(O(1)\) 求 lca 可以去掉一个 \(\log\)

T1

对于每个 \(k\) ,计算 \(\gcd(S)=k\) 的集合的 \(k^{|S|}\) 值和。

\(f_{k,i}\) 表示 \(\gcd (S)|i\) 的集合的 \(k^{|S|}\) 之和,那么求一个这个东西要对 \(\frac n i\) 个点 dp。

注意到 \(\gcd (S)=k\) 的集合的 \(k^{|S|}\) 之和就等于 \(\sum\limits _{l=1}^{\frac n k}\mu(i)\times f_{k,i-k}\) 。这个式子直接算就可以。

T2

\(f_{i,j}\) 表示下一个吉击打的点是 \(i\) ,当前距离中心线距离是 \(j,\) 此时期望能走多远。则 \(f_{ij,}=1+p_if_{i+1,j}+\frac{1-p_i}{2}f_{i,j+1}+\frac{1-p_i}{2}f_{i+1,j+1}\)

中心线的时候可能不大一样。

我们用一个列向量 \(F_i=(f_{i,0},f_{i,1},...,f{i,k})^T\) ,那么 \(F_i\) 就可以写成 \(M_iF_{i+1}\) 。于是我们将一圈矩阵乘起来,我们就能得到形如 \(F_i=MF_i\) 的方程于是可以解出 \(F_i\) ,我们用线段树去维护矩阵乘法就可以了。首先去掉两边的点,这些点只能有一种方案,下面每个点可以表示成 \((x,y)\) 的形式,表示到左右洞的距离。那么问题就可以变成这样:每次操作可以向上移动 \(x\) 轴或者向右移动 \(y\) 轴,先被 \(x\) 轴覆盖染成红色,被 \(y\) 轴覆盖染成蓝色,问最终可能出现多少种局面。

T3

注意到 \((x_1,y_1)\)\((x_2,y_2)\) 左上方时,\((x_1,y_1)\) 是红色时,\((x_2,y_2)\) 必然是红色,且只要所有点满足这个条件,就一定存在方案。可以发现,一种染色必然对应一个 \(y\) 的严格上升子序列,于是只需要统计严格上升子序列个数就可以了。

杂题选讲

1 AGC036D Negative Cycle

给定一张 \(n\) 个点的有向图(点从 \(0\) 开始标号),初始 \(i\)\(i+1\) 有权值为 \(0\) 的边。

然后有 \(n(n-1)\) 条额外的边 \((i,j)\) ,若 \(i<j\) 则权值为 \(-1\) ,否则权值 为 \(1\)

你需要从图中删除若干条边,使得图中没有负环。不能删除 \(0\) 边。

删除边 \((i,j)\) 的代价是 \(A_{i,j}\)

求最小代价。

\(3\le n\le 500,1\le A_i\le 10^9\)

这张图没有负环,当且仅当从 \(0\) 号点到每个点 \(i\) 都存在一个最短距离 \(d_i\) ,那么有 \(d_i\ge d_j+1\)。如果我们记 \(e_i=d_i-d_{i+1}\) ,那么 \(e_i\) 一定是非负整数,且对于每条 \(-1\)\((i,j)\) ,都有 \(e_i+e_{i+1}+...+e_{j-1}\ge 1\),对于每条 \(1\)\((j,i)\),都有 \(e_i+e_{i+1}+...+e_{j-1}\),不难发现 \(o\le e_i\le 1\)

问题变成能否确定 \(e\) ,于是我们可以有这样一个思路,确定 \(e\) ,然后将那些不满足条件的边删掉。

考虑 dp ,\(dp_{i,j}\) 代表确定了 \(e_0...e_i,e_i=1\),且上一个是 \(e_j\) ,此时删边的最小代价。考虑从 \(dp_{i,j}\)\(dp_{k,j}\) 的转移,此时需要删掉满足 \(j<a\le i,k<b\)\(1\)\((b,a)\),以及满足 \(i<a<b\le k\)\(-1\)\((a,b)\),拿个二维前缀和就 ok 了。

时间复杂度 \(O(n^3)\) ,能过。

2 CF708E Student's Camp

\((n+2)\times m\) 块砖,开始摆成 \(n+2\) 行和 \(m\) 列,行从 \(0\) 开始编号。每天白天,对于第 \(1\) 行到第 \(n\) 行的最左边的砖块,它有 \(p=\frac{a}{b}\) 的概率会消失,每天晚上,对于第 \(1\) 行到第 \(n\) 行的最右边的砖块,它有 \(p\) 的概率会消失。你需要求出,在 \(k\) 天之后,第 \(0\) 行与第 \(n+1\) 行有多大的概率依然是联通的(有公共角不算相邻,有公共边才算相邻)。答案对 \(10^9+7\) 取模。

\(1\le n,m\le 1500,k\le 100000,1\le a\le b\le 10^9\)

我们从最简单的 dp 开始想起,设 \(f_{i,l,r}\) 表示考虑完前 \(i\) 行,第 \(i\) 行只剩下 \([l,r]\) ,此时第 \(0\) 行与第 \(i\) 行依然有联通的概率。对于每一行,记 \(p_i\) 代表恰有 \(i\) 个白天满足“最左边的砖消失”,显然每一行都是相同的,并且白天和晚上的 \(p\) 也是相同的。

\(f_{i,l,r}=p_{l-1}p_{m-r}\sum\limits_{1\le a\le b\le m}f_{i-1,a,b}\)

而这是一个 \(O(nm^4)\) 的 dp,我们考虑优化。

我们用补集转化思想,用总的方案减去 \([a,b]\)\([l,r]\) 不想交的方案数。记 \(F_{i,r}=\sum\limits_{l=1}^rf_{i,l,r}\) ,那么 \(f_{i,l,r}=p_{l-1}p_{m-r}(\sum\limits_{b=1}^mF_{i-1,b}-\sum\limits)_{b=1}^{l-1}F_{i-1,b}-\sum\limits_{b=1}^{m-r}F_{i-1,b}\)

最后一个是为什么呢,因为左右翻转答案不变,用 \(S_{i,r}\) 表示 \(F_{i,r}\) 的前缀和,就可以做到 \(O(1)\) 转移。这是一个 \(O(nm^2)\)

这样无法在优化,因为状态数是 \(O(nm^2)\) ,我们考虑不计 \(f\) ,我们将 \(F\) 展开,得到 \(F_{i,r}=\sum\limits_{l=1}^rp_{l-1}p_{m-r}(S_{i-1,m}-S_{i-1,l-1}-D_{i-1,m-r})\)

这里面涉及两个前缀和,处理后可以 \(O(1)\) 转移。时间复杂度 \(O(mn)\)

3 [SDOI2013] 淘金

注意到坐标改变中 \(x,y\) 是独立的,记 \(cnt(i)\) 代表满足 \(f(i)=i\)\(j\) 的个数,则 \((x,y)\) 处金子的个数为 \(cnt(x)\times cnt(y)\)

同时,如果 \(cnt(x)\) 不是 \(0\) ,则它一定可以表示成 \(2^a3^b5^c7^d\) 的形式,在 \(N\le 10^{12}\) 这种新式的数字最多只有 \(14672\) 个,所以最多只有这么多 \(cnt\) 不是 \(0\) ,于是可以跑一个数位 dp 求 \(cnt\) 。设 \(dp_{i,j,0/1}\) 表示考虑完前 \(i\) 位,乘积是 \(j\) 的方案数。

求出 \(cnt\) ,怎么取前 \(k\) 大的 \(cnt(x)\times cnt(y)\) 呢?我们对 \(cnt\) 排序,对于每一个 \(x_i\) 记一个 \(y_i\) ,初始都是 \(cnt\) 最大的那一个。

拿堆维护 \(x_i\times y_i\) ,每次取出最大的之后,将 \(y_i\) 变成 \(cnt\) 较小的 \(y\)

,重复 \(k\) 次。

4 CF303E Random Ranking

首先可以将整个已知线段划分为至多 \(2n\) 条区间;考虑 \(x_1\) ,假设已知 \(x_1\) 取在第 \(j\) 个区间内(区间从小到大编号,下同),而 \(x_2,...x_n\) 中有 \(a\) 个数取在第 \(1...j-1\) 个区间内,有 \(b\) 个数取在第 \(j\) 个区间内,\(n-1-b-c\) 个数取在剩下的区间内,那么 \(x_1\) 的排名可能在 \(a+1\)\(a+b+1\) 之间,并且取每个排名的概率都是相等的。

ans[i][j] 为答案数组。枚举 \(i\)\(x_i\) 所在区间,然后进行一个 dp,\(dp_{k,a,b}\) 表示考虑前 \(k\) 个数(不包括 \(x_i\) ),有 \(a\) 个比 \(x_i\) 所在区间小,\(b\) 个与 \(x_i\) 在同一个区间,这种情况出现的概率是多少。这就是个简单的背包 dp。

跑完之后,将答案累加到 ans[i][a+1,...,a+b+1] 中。

这样的复杂度是 \(O(n^5)\) 的。

5 CF303E Random Ranking

但是这题可以做到 \(O(n^4\log n)\) 。因为我们 dp 前要枚举 \(i\) ,可以发现,我们 dp 时会重复计算很多东西。有一种解决方法是分治。对于这道题,我们先枚举区间 \(j\)solve(j,l,r) 代表我们要计算出每个 \(l\le i\le r\) 的答案。将需要计算的答案分成 \([l,mid]\)\([mid+1,r]\) 两部分,然后在递归 \([l,mid]\) 时将 \([mid+1,r]\) 加入背包,右半部分同理。递归到底层时就能算出对应的 dp 值。

6 CF338D GCD Table

有一个 \(n\times m\) 的表格 \(G\) ,其中 \(G(i,j)=\gcd (i,j)\) 。给定一个正整数序列 \(a_1,...,a_k\) ,你需要判断这个序列是否在 \(G\) 中出现。一个正整数序列在 \(G\) 中出现的意思是,存在一对 \(i,j\) ,使得对于所有 \(1\le t\le k\) ,有 \(G(i,j+t-1)=a_t\)\(n,m\le 10^{12},k\le 10000\)

如果序列在 \(G\) 中出现,则行数肯定是 \(lcm(a_1,...,a_k)\) 的倍数。

很容易证明,如果能出现,则它一定可以在第 \(lcm(a_1,...a_k)\) 行出现。假设它对的第一个是第 \(j\) 列,那么 \(j\) 必须满足下面的 \(k\) 个方程:

\[j_t-1\equiv 0\bmod a_t \]

我们做 excrt 就 ok 了。

7 CF364D Ghd

给定 \(n\) 个数 \(a_1,...a_n\) ,求最大的 \(g\) ,使得能够整除至少一半的数。\(n\le 10^6,1\le a_i\le 10^{12}\)

假设最终答案是 \(g\) ,那么勘定有一半以上的数字被 \(g\) 整除。如果我们随机选取一个 \(a_i\) 那么有 \(\frac 1 2\) 的概率,\(a_i\) 会是答案的倍数。

那么我们现在就假装答案是 \(a_i\) 的约数。对于其他的数 \(a_j\) ,我们只需要关心 \(\gcd (a_j,a_i)\) 在给定的数据范围下,\(a_i\) 的约数个数 \(s_i\) 最多只有几千个。对于每个约数 \(d_k\) ,我们记 \(c_k\) 代表能被 \(d_k\) 整除的数的个数,那么我们可以在 \(O(n\log a_i+s_i^2)\) 的时间内算出 \(c\) 并更新答案。我们重复上 \(m\) 次,正确率就能有 \(1-2^{-m}\) ,通常我们的 \(m\) 取10 就可以了。

8 CF497E Subsequences Return

定义 \(s_k(n)\) 代表 \(n\)\(k\) 进制下各个数位的和。现在有一个序列 \(a_0,...a_{n-1}\) ,其中 \(a_i=s_k(i)\bmod k\) ,你需要计算 \(a\) 有多少个不同的子序列。空子序列也是子序列。答案对 \(10^9+7\) 取模。

其中 \(n\le 10^{18},2\le k\le 30\)

首先,如何求一个序列不同的子序列的个数呢?

\(f_{i,j}\) 表示前 \(i\) 个数,以 \(j\) 结尾的子序列个数,那么 \(f_{i,a_i}=1+\sum\limits_{j=0}^{k-1}f_{i-1,j}\)\(f_{i,j}=f_{i-1,j},j\not =a_i\)

这个转移可以表示成矩阵的形式。一共有 \(k\) 个矩阵,我们记为 \(M_0,...M_{k-1}\) 那么我们就需要求 \(s\times M_{a_0}\times M_{a_1}\times ...\times M_{a_{n-1}}\) (当然也可能是左乘,看你怎么写)。

9 CF497E Subsequences Return

\(F_{m,i}\) 表示从 \(a_{i\times k^m}\)\(a_{(a+1)\times k^m-1}\) ,这一段的转移矩阵是什么。

显然,\(F_{0,i}=M_i\)\(F_{j,i}=F_{j-1,i}\times F_{j-1,i+1}\times ...\times F_{j-1,k-1}\times F_{j-1,0}\times ...\times F_{j-1,i-1}\) 第二个是因为,如果我们确定了前面若干位的值,矩阵只跟前面的每一位的和有关。利用前缀积转移,只需要做 \(O(k\log_k n)\) 次矩阵乘法即可求出所有的 \(F\) 。求出 \(F\) ,求解答案也只需要进行 \(O(k\log_k n)\) 次矩阵乘法。

10 CF512D Fox And Travelling

有一张 \(n\) 个点 \(m\) 条边的无向图,每次1你可以删一个点,要求是这个点最多只能有一个邻点。对于所有的 \(k=0...n\) ,问长度为 \(k\) 的删点序列有多少种可能。\(n\le 100\)

有环的话,环上的点肯定删不了。找出所有能删的点,那么能删的部分要么是一棵独立的树,要么是一棵从环上长出来的树。显然树与树之间的删除是不会相互影响的,所以可以先对每个部分求一下删除 \(k\) 个点的方案数,然后用背包去计算方案(用组合数合并两部分)。这部分是 \(O(n^2)\) ,所以问题变成如何求每一部分的方案数。

如果是从环里长出来的树,做起来会简单一些。令 \(f_{u,i}\) 表示以 \(u\) 为根的子树内删了 \(i\) 个点的方案数,转移就是一个背包,整颗子树都删的情况特殊处理。但是如果是一棵独立的树,怎么做呢?如果全部删完,可以考虑每个点最后一个删的情况。如果没有全删完,就可以先随便选个根,然后再最后剩下点中深度最小的点处进行统计答案。这个只需要做一下换根 dp 的东西就行了。这也是 \(O(n^2)\) 的。

11 CF585E Present for Vitalik the Philatelist

\(n\) 个数字 \(a_1,...a_n\),你需要从中选一个数字 \(a_i\),然后从剩下的数中选一个非空子集 \(S\) ,要求从 \(S\) 中元素的 $\gcd $ 大于 \(1\) ,但 \(S\cup\{a_i\}\) 中的 \(\gcd\)\(1\)

输出方案数对 \(10^9+7\) 取模的结果。

其中 \(n\le 10^5,a_i\le 10^7\)

首先有一个想法:对于每个元素 \(a_i\) ,求出不包含 \(a_i\) 的,满足 \(\gcd\) 不是 \(1\)\(\gcd\)\(a_i\) 互质的集合个数。这东西看起来就很麻烦,但幸运的是,这东西就等于所有 \(\gcd\) 不为 \(1\) 的非空集合个数,减去所有 \(\gcd\)\(a_i\) 不互质的非空集合个数。所有的 \(\gcd\) 不为 \(1\) 的集合数量怎么算呢?记 \(cnt_i\) 为能被 \(i\) 整除的数的个数,那么这个数字就是 \(\sum\limits_{i>1}-\mu(i)(2^{cnt_i}-1)\)

\(\gcd\)\(a_i\) 不互质的集合数量呢?

数量为 \(\sum\limits_{i>1,i|a_i}-\mu(i)(2^{cnt_i}-1)\) ,看上去这东西算起来很慢,但是因为数据范围下 \(a_i\) 最多有 \(8\) 个质因子,不为 \(0\)\(\mu(i)\) 最多只有 \(2^8-1=255\) 个,这个题就做完了。

12 CF718D Andrew and Chemistry

给定一棵 \(n\) 个点的每个点度数都不超过 \(4\) 的数,你需要给这棵树添加一个点和一条边,使得这棵树还是树并且每个点的度数不超过 \(4\) ,问你最多能构造出多少棵不同构的树。称两棵树 \(S,T\) 同构,如果存在一个点到点的双射 \(f\) ,使得 \(S\)\(u,v\) 相邻当且仅当 \(T\)\(f(u),f(v)\) 相邻。

\(1\le n\le 100000\)

首先如何判断两棵树同构呢?我们可以考虑哈希。一种方法是先选定树的重心作为根(可能有两个),然后对于每个节点,将它们的孩子按照某种顺序(比如哈希值)排序,然后用某种方式计算哈希值。对于每个节点,记 \(f_u\) 表示,在 \(u\) 的子树内添加一个叶子,最多会形成多少棵不同构的子树。对于 \(u\) 的每棵子树,如果若干棵子树同构,就可以认为只会加在其中某一棵子树内。\(f_u\) 就是这样去重后儿子的 \(f\) 之和。特别地,如果 \(u\) 度数小于 \(4\) ,就得让 \(f_u\)\(1\)

如果只有一个重心,直接以重心为根做一遍然后输出重心的答案就行了。如果有两个重心呢?可以分成两棵树分别做;此时如果两棵树同构,答案为其中任意一棵树的答案,否则答案为两树答案相加。

13 CF722E Research Rover

有一个 \(n\times m\) 的网络,有一个人初始在 \((1,1)\) ,当他在 \((x,y)\) 时,他可以走向 \((x+1,y)\) 或者 \((x,y+1)\)

他有一个数字 \(s\) ,有 \(k\) 个格子是特殊的,当他每次进过特殊格子的时候,数字会变成 \(\left\lceil\frac s 2\right\rceil\)。他会从所有到达 \((n,m)\) 的路线中随机选择一条,问最终数字 \(s\) 的期望是多少。

\(1\le n,m\le 10^5,0\le k\le 2\times 10^3,1\le s\le 10^6\)

注意到经过 \(20\) 个特殊格子后 \(s\) 就一定是 \(1\) ,所以可以先办法计算出经过 \(i(0\le i\le 20)\) 个格子的方案数。令 \(dp_{u,i}\) 表示,当前在特殊格子 \(u\) ,从这个格子除法到达 \((n,m)\) ,且此后恰好经过 \(i\) 个特殊格子的方案数。我们将 \((1,1)\) 试作第 \(0\) 个特殊格子的方案数。我们将 \((1,1)\) 视作第 \(0\) 个特殊格子。怎么算 \(dp_{u,i}\) 呢?一个方法是容斥:用至少经过 \(i\) 个点的方案数减去至少经过 \(i+1\) 个点的方案数。至少经过 \(i\) 个点的方案数就是 \(C_{n-x_u+m-y_u}^{n-x_u}-\sum\limits_{j=0}^{i-1}dp_{u,i}\)。而至少经过 \(i\) 个点的方案数呢?不难发现如果至少经过 \(i+1\) 个点,那么肯定中途会经过一个点,并且在这个点之后恰好经过 \(i\) 个点。于是可以枚举能到达的点 \(v\) ,这样的方案数为 \(C_{xv_-x_u+y_v-y_u}^{x_v-x_u}dp_{v,i}\) ,计算出 \(dp_{0,i}\) 后可以很快计算出本题答案。时间复杂度是 \(O(n^2\log s )\)

14 CF793E Problem of offices

给定一棵 \(n\) 个点的有根树,我们会按照某条路线从根开始重复遍历这棵树,并且使得路线尽可能的短(从根出发,回到根之前会遍历所有结点,并且会走 \(2n-2\) 条边)。

有两条信息:重复遍历的过程中,叶子 \(a\) 到叶子 \(b\) 之间的点数与叶子 \(b\) 到叶子 \(c\) 之间的叶子数相同。这里面,\(a,b,c,d\) 之间任意两点之间的路径都会经过根节点。

你需要判断上述信息能否可能为真(即是否存在满足上述薪资的遍历方式)。\(n\le 5000\)

首先这四个节点的遍历顺序不能是 \(abcd\) ,这样肯定不满足条件。不妨假设遍历顺序是 \(abcd\),否则可以反过来。于是我们需要将 \(abcd\) 所在子树中的分支安排位置(在前面还是在后面),以及其他的子树在 \(4\) 个部分中的哪一个部分。要求相邻两部分加起来恰好有一半。

左半部分中,\(a\) 是不变的,能产生贡献的只有 \(cd\) 所在子树以及其它子树,上半部分同理。

注意到对于其他的子树,它在左右和在上下是独立的,也就是说,它在上半部分不会影响它在左半部分和右半部分的情况。于是我们可以分别进行背包 dp。记 \(f_i,g_i\) 分别为左半部分叶子数为 \(i\) ,上半部分叶子数为 \(i\) ,这样的方案是否存在,这就是个背包 dp。

\(f\) 能加入背包的的有 \(cd\) 所在子树的其他分支以及其他子树,\(g\) 能加入背包的有 \(ab\) 所在子树的其他分支以及其他子树。最后只需要检查 \(f_{s-size_a}\)\(g_{s-sizea_c}\) 就可以了,其中 \(s\) 为叶子数的一半。

15 CF794E Choosing Carrot

两个人在玩游戏,有 \(n\) 个数排成一排。两个人轮流操作,每次操作可以取走最边上的一个是,直到只剩下一个数。先手希望剩下的数尽可能的大,而后手希望剩下的数尽可能的小。后手去上了一趟厕所,于是先手打算先进行 \(k\) 次操作(等后手回来的时候他还是要先操作)。你需要对于所有的 \(k=0,1,...n-1\) 输出当两个人都进行最优操作的时候,剩下的数是多少。\(n\le 3\times 10^5\)

假设数字只有 \(0\)\(1\) ,那么 \(k=0\) 时答案应该是什么呢?

如果 \(n=1\) ,答案就是中间那个数,对于其他情况:

如果 \(n\) 是偶数,那么只要中间两个数中有一个是 \(1\) ,先手就一定能让最后一个是 \(1\) ,如果 \(n\) 是奇数,那么如果先手能让最后一个数是 \(1\) ,中间的数就必须是 \(1\),并且其两边的数至少有一个是 \(1\)

假设我们进行二分答案,那么判断答案是否超过 \(mid\) 的时候,问题就变成数字只有 \(01\) 的情况。

但仔细一想,我们实际上并不需要二分答案就可以得到结果(下面 \(x=\left \lceil \frac n 2 \right \rceil\)

  • \(n\) 是偶数,答案为 \(\max (ax_,a_{x+1})\)
  • \(n\) 是奇数,答案为 \(\min (a_x,\max(a_{x-1},a_{x+1}))\)

那么现在需要对所有 \(k\) 求解,怎么办?

注意到如果删除 \(k\) 个数可以使某两个或三个数位于最中间,那么删除 \(k+2\) 个数也可以做成这样。于是可以对每相邻的两个或三个数,都求出想要让这些数位于最中间,至少需要删掉多少个数。这样就可以用前缀 max 在 \(O(n)\) 的时间内得到答案了。

16 CF794G Replace All

给定两个包含 \(AB\) 的字符串 \(x,y\),称一对 \(01\)\((s,t)\) 是好的,如果:

  • $1\le |s|,|t|\le n $,将 \(x,y\) 中的 \(A\) 替换成 \(s\)\(B\) 替换成 \(t\) ,得到的两个字符串相等。定义一对字符串 \((x,y)\) 的灵活度为好的有序对 \((s,t)\) 的个数。给定两个字符串 \(c,d\)\(?\) 替换成 \(A\)\(B\) 得到的字符串,答案对 \(10^9+7\) 取模。
  • \(1\le |c|,|d|,n\le 3\times 10^5\)

首先,我们肯定要先想一个简单一定的问题,对于两个不包含 \(?\) 的字符串 \(x,y\), 答案是什么。

我们可以去掉 \(x,y\) 的公共前缀,因为无论 \(s,t\) 是啥,这个公共前缀替换之后一定相等。如果 \(x=y\) ,所有的 \(s,t\) 都是满足条件的 ,于是我们假设 \(x\not = y\) ,这样在去掉公共前缀之后,第一个字母肯定不相同。

由于第一个字母不相同,所以 \(s,t\) 中必然有一个是另一个的前缀,不妨设 \(t=s+r\) ,则我们相当于用 \(s\)\(r\) 去组成 \(x\)\(y\) ,此时会发现 \(s\)\(r\) 还是前缀关系。我们通过这个思路,定义如下关系:

定义两个字符串 \((s,t)\) (其中 \(|s|\le |t|\) )互质,要么 \(s=t\) ,要么

\(s\)\(t\) 的前缀。且如果 \(t=s+r\)\((s,r)\) 也是互质的。

如果 \(|s|>|t|\) ,那么 \((s,t)\) 互质当且仅当 \((t,s)\) 也是互质的。

那么本题中“好的”字符串一定也是互质的。

同时,有一个性质:互质的字符串 $(s,t) $ 一定满足 \(s+t=t+s\) ,归纳一下就行了:\(t=s+r,s+s+r=s+r+s\Leftrightarrow s+r=r+s\) ,这说明什么?我们可以任意的交换两个相邻的 \(s,t\) ,这样得到的结果是不变的,于是我们可以将 \(x,y\) 中的 \(A\)\(B\) 排序。

\(x_A,x_B,y_A,y_B\) 为两个字符串 \(A,B\) 的出现次数,那么如果 \((x_A,x_B)>(y_A,y_B)\) ,肯定是没有方案的。

我们现在先假设 \(x_A>y_A,x_B<y_B\) ,这就相当于要使得 \(x_A-y_A\)\(s\) 拼起来和 \(y_B-x_B\)\(t\) 拼起来长得一样。

\(a=x_A-y_A,b=y_B-x_B\) ,那么如果 \(a=b\) ,我们只能让 \(s=t\) ,否则 假设 \(a>b\) ,那么 \(|s|<|t|\) 我们有 \(t=s+r\) 。由于 \(s\)\(r\) 也互质,我们可以随便交换顺序,于是可以将两边重复的 \(s\) 删掉,于是左边就变成了 \(a-b\)\(s\) ,右边就变成了 \(b\)\(r\) ,那么如果 \((s,r)\) 是满足 \((a,b)\) 的字符串,那么 \((s,r)\) 就是满足 \((a-b,b)\) 的字符串。于是无论如何,我们都会将问题变成一个递归的形式。不妨假设最终我们会递归到 \((1,1)\) 于是如果原问题为 \((a,b)\) ,我们的 \(s,t\) 就会是 \(b\)\(/a\) 个字符串 \(u\) 拼起来,注意到我们有限制的 \(|s|,|t|\le n\) ,于是答案就是长度不超过限制的非空 \(01\) 串的数目。

还有一种情况:\(x_A=y_A,x_B=y_B\) ,这种时候,所有互质的 \((s,t)\) 都满足条件,于是只需要计算长度不超过 \(n\) 的互质字符串的对数。

有一个结论:满足 \(|s|=a,|t|=b\) 的互质字符串 \((s,t)\) 的数量为 \(2^{\gcd(a,b)}\) 这个归纳可以证明。

然后我们需要计算的就是 \(\sum_{a=1}^n\sum_{b=1}^n 2^{gcd(a,b)}\) 。我们记 \(ans_k\) 代表 \(\gcd(a,b)=k\)\((a,b)\) 对数,\(cnt_k\) 表示 \(k|\gcd(a,b)\)\((a,b)\) 对数,那么 \(ans_k=\sum\limits _{i=1}^\left\lfloor\frac n k\right\rfloor \mu(i)cnt_{i\times k}\) 这样的复杂度是 \((n\log n)\)

posted @ 2021-06-09 22:26  hyl天梦  阅读(134)  评论(0编辑  收藏  举报