2023.3

发布时间 2023-03-30 20:48:00作者: 云浅知处

SXOI2022 整数序列

考虑一组询问怎么做。注意到 \(\sum_{i=l}^rc_i=0\) 等价于 \(S_r=S_{l-1}\),其中 \(S\)\(c\) 的前缀和。

对每种 \(S\) 分别考虑,发现只需要求最大子段和。

由于区间的端点只会是 \(x,y\) 出现的位置,不难得到 \(O(c_x+c_y)\) 的做法,其中 \(c_x\)\(x\) 的出现次数。

接下来考虑将序列按照 \(x,y\) 的连续段分段,那么对于一个极长的 \(y\) 连续段,若其长度为 \(L\),只有它向前/向后的最开头 \(L+1\) 个数是有效的。

许多题解没有提到啊,看上去只有 \(L\) 个就够了,为什么需要 \(L+1\) 个?

考虑这样的一段 xxyyyyyyyyyyyyyxx,那么左右两侧的 xx 是连不到一起的,但是如果我们只保留 \(L\) 个,那么最后会留下来 xxyyyyxx,可能会把左右两侧的 xx 连到一起。如果这两个 xx 刚好权值都比较大就寄了对不对,因此方便的处理方式是保留 \(L+1\) 个,或者也可以像 rsy 题解里那样保留 \(L\) 个,然后每一段分别做。

这样就得到了 \(O(\min(c_x,c_y))\) 的做法。

我们证明暴力记忆化的复杂度是对的:

  • \(\min(c_x,c_y)\le \frac{n}{\sqrt{q}}\),则这部分复杂度不超过 \(q\times \frac{n}{\sqrt{q}}=n\sqrt{q}\)
  • \(\min(c_x,c_y)>\frac{n}{\sqrt{q}}\),这样的 \(x\) 至多 \(\sqrt{q}\) 个,对于每个 \(x\),由于 \(y\) 同样也只有 \(\sqrt{q}\) 个,对所有 \(c_y>\frac{n}{\sqrt{q}}\)\(y\) 求和 \(\min(c_x,c_y)\) 的结果不会超过 \(\sum_y c_x+c_y\le n+c_x\times \sqrt{q}\),再把这一结果对 \(x\) 求和就得到了这部分的复杂度同样是 \(O(n\sqrt{q})\)

总复杂度 \(O(n\sqrt{q})\)。多一个 \(\log\) 或许也无所谓?

ZJOI2019 语言

一眼 \(O(n\log^3n)\) 树剖+矩形面积并,不想写。

枚举点 \(i\),算符合条件的 \(j\) 的数量。发现只需要求出覆盖 \(i\) 的所有链的链并大小。

注意到,树上 \(k\) 条链相交于一点,他们的链并就是这 \(2k\) 个端点构成的虚树大小。关于虚树大小有经典的结论,只需要维护按照 DFS 序排序后的结果。

树上差分+线段树合并维护经过每个点的所有 \(2k\) 个点按照 DFS 序排序的结果,合并时计算贡献即可;线段树需要维护每个节点代表区间内最左端和最右端的 DFS 序位置。可以用欧拉序配合 ST 表做到 \(O(1)\) 查询两点距离,从而得到 \(O(n\log n)\) 的算法,不过这题 \(n\) 比较小所以树剖 \(O(n\log ^2n)\) 也就过了。

B

为了方便,我们把 \(x,y\) 都和 \(r\) 补齐到同样的位数,前面看作前导零。

接下来对每个数字 \(c\) 计算 \(f(i,c)\) 表示 \([l,r]\) 中排序后恰好第 \(i\) 位是 \(c\) 的方案数。这个可以对每个 \(c\) 设计 \(g(i,j,k,0/1)\) 表示 \(i\) 位填了 \(j\)\(<c\) 的数,\(k\)\(=c\) 的数,是否顶上界的方案数。

最后的答案就是 \(\sum_i\sum_{c_1,c_2}f(i,c_1)f(i,c_2)|c_1-c_2|\)

B

建出 \(n\) 个点 \(0,1,\cdots,n-1\),对每个 \(x\) 连向 \((bx+i)\bmod n,i=0,1,\cdots,b-1\) 这些点,其中只有 \(x\to bx\bmod n\) 这条边边权为 \(0\),其余边的边权均为 \(1\)。那么要求的就是 \(1,\cdots,b-1\) 这些点到 \(0\) 的最短路长度。

发现连向的点形成区间,随便来点 ds 优化建图就 \(O(n\log n)\) 了。注意此题有特殊性质,边权均为 \(0/1\),因此 bfs 的时候每个点第一次被更新的值就是最短路。转化为区间覆盖所有没有被覆盖的元素,单点修改;用并查集维护即可做到每个点只被覆盖一次,时间复杂度 \(O(n)\)

Crash 的文明世界

先普通幂转下降幂,考虑算 \(\sum_j\text{dist}(i,j)^{\underline k}\)

先做一遍 DP,设 \(f(u,j)=\sum_{v\in\text{subtree}(u)}\text{dist}(u,v)^{\underline j}\),发现 \((x+1)^{\underline k}=x^{\underline k}+kx^{\underline{k-1}}\),于是有

\[f(u,j)=\sum_{v\in\text{son}(u)}f(v,j)+j\times f(v,j-1) \]

接下来换根即可,这部分比较 ez。最后算个第二类斯特林数转回普通幂即可。

复杂度 \(O(nk+k^2)\)

ZJOI2016 小星星

\(f(u,j,S)\) 表示 \(u\) 为根的子树,恰好用 \(S\) 以内的这些数,\(p_u=j\) 的方案数。

你可以直接在转移的时候做集合不交并卷积,但是我们可以容斥:排列看作所有数至少出现一次,钦定某些元素不能出现,然后对每个集合 \(S\) 做一遍 \(O(n^3)\) 树形 DP(即 \(f(u,j)\) 表示 \(u\) 子树内,且 \(p_u=j\) 的方案数,但这里要求 \(j\not\in S\)),设得到的值是 \(g(S)\),则答案为 \(\sum(-1)^{|S|}g(S)\)

时间复杂度 \(O(n^32^n)\),空间复杂度 \(O(n^2)\)

夜夜

不超过 \(k\) 转成恰好 \(k\) 个,wqs 二分。

关于 wqs 二分中的一些细节:

(引自 https://atcoder.jp/contests/abc218/editorial/2634)

  • When implementing, we have to be careful of the values around boundary, or it may cause a bug if there is no \(C\) that the number of choices is \(R\).
    For example, in the example above, both \(f(3)−f(2)\) and \(f(4)−f(3)\) are \(5\), so there doesn’t exist such \(C\) that the optimal number is \(3\). In such case, if we assume precedence only based on DP, we may not be able to obtain correct \(T\). This can be resolved by, for example, when doing DP, “tie-breaking the combinations of the same score by the number of painted balls.”
  • If we use decimals for binary search, we cannot obtain correct answer for large \(N\) and \(A\). Although many materials of Alien DP does binary search over decimals, this problem has the maximum answer of as large as \(2 \times 10^{14}\), which requires very high precision, accompanied by the necessity of subtraction of values with different signs, making it unable to compute \(C\) correctly.
    In this problem, the issue can be resolved by doing binary search for \(C\) over integers, using the property that the slope is integral. In case of decimals, we do not have to be nervous about the boundaries, but in case of integers, we may have to be cautious in implementing, so be careful.
  • 大意就是,wqs 二分可以直接二分实数斜率直接计算,但大部分题中 \(f(x+1)-f(x)\) 为整数,因此只需要二分整数斜率。
  • 第一句我没太看懂他怎么处理的,大致的意思是三点共线的情况不好处理,不过一般的处理方法是 DP 的时候尽量多选。

在本题中,wqs 二分之后转为选一个 \(A_i>A_{i+1}\) 就要减去 \(x\) 权值。线段树优化 DP 即可。

JSOI2018 潜入行动

每个点要么被父亲覆盖,要么被儿子覆盖。

\(f(u,0/1,0/1)\) 表示 \(u\) 子树内,\(u\) 是否放置,是否有 \(u\) 的某个儿子放置,需要覆盖 \(u\) 子树内除了 \(u\) 以外的所有点,的方案数。每个 \(f\) 都是一个背包,里面有 \(j\) 个元素。考虑转移

  • \(f(u,0,0)\):把所有 \(f(v,0,1)\) 卷起来就行。
  • \(f(u,1,0)\):把所有 \(f(v,0,0)+f(v,0,1)\) 卷起来。
  • \(f(u,0,1)\):把所有 \(f(v,0,1)+f(v,1,1)\) 卷起来,再减去 \(f(u,0,0)\)
  • \(f(u,1,1)\):把所有 \(f(v,\cdot,\cdot)\) 卷起来,再减去 \(f(u,1,0)\)

由树上背包的经典结论可知复杂度 \(O(nk)\)

PKUSC2018 最大前缀和

枚举最大前缀和最后一次出现的位置。

考虑钦定集合 \(S\) 放在最前面作为最大前缀和。那么有两个限制:

  • \(S\) 以内元素排列后,每个非全局的后缀和都要 \(\ge 0\)
  • \(U-S\) 以内元素排列后,每个非空前缀和都要 \(<0\)

\(f(S),g(S)\) 表示这两个约束,可以简单 \(O(n2^n)\) 求出。最后答案就是 \(\sum f(S)g(U-S)\sum_{i\in S}p_i\)

HNOI2008 玩具装箱

额怎么现在才写这个斜率优化,但是我还是不会维护凸包啊,流汗

\(f_i\) 表示前 \(i\) 个数任意分段的最小代价,转移是

\[\begin{aligned}f_i&=\min_{j<i}f_j+\left(S_i-S_{j}+i-j-1-L\right)^2\\&=(S_i+i-1-L)^2+\min_{j<i}f_j+(S_j+j)^2-2(S_i+i-L-1)(S_j+j)\end{aligned} \]

\(a_i=S_i+i-L-1,b_i=S_i+i\),那么转移是一个 \(f_i=a_i+\min_{j<i}f_j+a_ib_j\) 的形式。

发现相当于维护一个集合,里面有若干 \((b_i,f_i)\),每次询问给一个 \(x\),查询最小的 \(f_i+xb_i\) 的值。

咦这不是插入直线查询单点最值吗,李超树秒了,拜拜

由于 \(x\) 范围是 \(V\) 所以还要动态开点,时空复杂度均为 \(O(n\log V)\)

NOI2007 货币兑换

由于题目保证:

必然存在一种最优的买卖方案满足:

每次买进操作使用完所有的人民币,每次卖出操作卖出所有的金券。

\(f_i\) 表示前 \(i\) 天的答案,有两种转移:第 \(i\) 天啥也不干,转移到 \(f_{i-1}\);或者卖出一次,枚举上一次买入的时刻,转移到

\[\max_{j<i}\dfrac{f_j\times R_j}{A_jR_j+B_j}\times A_i+\dfrac{f_j}{A_jR_j+B_j}\times B_i \]

发现相当于维护一个集合,里面有若干 \((a_i,b_i)\),每次询问给一个 \(x,y\),查询最大的 \(ax+by\) 的值。

简单变换一下变成 \(y(a\times \frac{x}{y}+b)\),发现 \(\frac{x}{y}\) 是实数,似乎不能李超树

但无所谓的,我们把所有的 \(\frac{x}{y}\) 提前存下来就行啦,复杂度 \(O(n\log n)\)

CSP-S 2021 括号序列

注意超级括号序列的括号匹配方案仍然是唯一的。

简单分类讨论一下:

  • \(l,r\) 两个位置的括号恰好匹配,则括号形如 (),(S),(AS),(SA),(A)。注意到超级括号序列仍然必须以 () 开头结尾,考虑枚举最长的前缀/后缀使得他们全都是 *,即可不重不漏地进行转移。

  • \(l,r\) 两个位置的括号不互相匹配,枚举 \(l\) 的配对位置 \(p\),那么括号序列形如 AB 或者 ASB,转移到 \(\sum_{i=p+1}^{p+k+1}w(p+1,i-1)\times f(l,p,\cdot)\times f(i,r,1)\)。其中 \(w(l,r)\) 表示 \(s[l\cdots r]\) 能否全填成 *。前缀和优化即可。

最终的状态就是 \(f(l,r,0/1)\) 表示 \([l,r]\) 内,\(l,r\) 两个位置是否匹配的方案数,以及

\[g(p,l,r)=\sum_{i=l}^rw(p+1,i-1)f(i,r,1) \]

那么 \(g(p,l,r)=g(p,l+1,r)+w(p+1,l-1)f(l,r,1)\),以及

\[f(l,r,0)=\sum_{p=l+1}^r\sum_{i=p+1}^{p+k+1}w(p+1,i-1)\times f(l,p,\cdot)\times f(i,r,1)\\=\sum_{p=l+1}^rf(l,p,\cdot)(g(p,p+1,r)-g(p,p+k+2,r)) \]

CTSC2016 时空旅行

显然确定要到哪个 \(i\) 之后,最优方案一定是把 \(y,z\) 设置为 \(y_i,z_i\),使得最终的花费是 \((x_0-x_i)^2+c_i\)。把所有版本的依赖树建出来,问题转化为维护点集 \((x,c)\),支持插入删除以及给出 \(p\),查询

\[\min_{(x,c)\in S}(p-x)^2+c=p^2+\min_{(x,c)\in S}-2px+c+x^2 \]

线段树分治然后李超树维护,复杂度 \(O(n\log^2n)\)。注意修改对询问独立,因此不需要撤销。

NOIP2017 逛公园

考虑先跑一边最短路求出 \(1\to i,i\to n\) 的最短路 \(f_i,g_i\)。设 \(1\to n\) 最短路长度为 \(L\),我们建一张新图。对于原图中的一条边 \((u,v)\),如果 \(w(u,v)+f_u+g_v\le L+K\),那么我们在新图中加入边 \((u,v)\);对于原图中的一个点 \(u\),如果 \(f_u+g_u\le L+K\),那么我们认为这个点在新图中存在。

如果新图存在 \(0\) 环,则答案为 \(\infty\);否则,我们可以设 \(\text{dp}[u][j]\) 表示 \(1\to u\) 的长度不超过最短路 \(+j\) 的路径个数。转移自然是简单的,问题在于转移是否会形成环。

我们发现,一条路径 \(1\to u\) 如果末尾加上一条边 \(u\to v\),那么这条路径的长度与最短路的差值不会变小,因此 \(\text{dp}[\cdot][j]\) 只会转移到 \(k\ge j\)\(\text{dp}[\cdot][k]\);另一方面,对于 \(j\) 相同的 \(\text{dp}[\cdot][j]\),它们之间的转移必须沿着最短路图上的边走。由于最短路图无环(在不存在 \(0\) 环的条件下),因此这部分转移也是无环的。综上,这个 DP 不具有后效性。

算法的时间复杂度为 \(O(M\log M+(N+M)K)\)

NOIP2017 列队

注意到对每一行和最后一列都只会删除中间的某个点,在末尾添加某个点。

这个怎么维护呢,考虑把序列分成原来就有的和新添加的,原来就有的那部分只需要支持删除与查询某个权值,动态开点线段树维护单点加区间求和与线段树上二分即可;新加入的那部分需要支持末尾插入,删除某个点与查询单点,FHQ Treap 可以轻松维护。

时间复杂度 \(O(q\log n+q\log m)\)

六省联考 2017 寿司餐厅

把区间看成点,那么一个方案合法当且仅当一个区间被选中后,它的子区间都要被选中。

发现此时类似于最大权闭合子图;考虑额外限制,发现相当于“如果集合 \(U\) 内点有一个被选中,就要额外付出 \(c\) 的代价“。对于这种限制,只需要先令答案加上 \(c\),接下来对每个 \(x\in U\),只需要对新的限制建一个负权点,仍然是最大权闭合子图。

六省联考 2017 分手是祝愿

考虑 \(k=n\) 怎么做。记 \(S(x)=\sum_{d|x}2^d\),以及题目中给的那个数 \(X=\sum_{a_i=1}2^i\),那么实际上就是要用 \(S(1),\cdots,S(n)\)\(n\) 个数选出尽量少的数,使得它们的异或等于 \(X\)

注意到 \(S(1),\cdots,S(n)\) 的最高位两两不同,因此它们之间线性无关,本身就构成一组线性基。也就是说,对于每个 \([0,2^n)\) 中的数,用 \(S(1),\cdots,S(n)\) 表示出它的最优方案是唯一的,类比线性基,一定是从高位向低位考虑,每次遇到一个 \(a_x=1\) 就异或上 \(S(x)\)

进一步,考虑 \(k<n\) 时,求出初始步数 \(c\),那么相当于每次有 \(\frac{c}{n}\) 的概率变成 \(c-1\)(选出的数在当前状态的表示内),有 \(1-\frac{c}{n}\) 的概率 \(+1\)。设 \(f_i\) 表示 \(i\) 步走到 \(\le k\) 步的期望步数,有

\[\forall i\le k,f_i=i\\ \forall n>i>k,f_i=1+\frac{i}{n}f_{i-1}+\frac{n-i}{n}f_{i+1}\\ f_n=f_{n-1}+1 \]

写出矩阵发现每行就三个值,\(O(n)\) 高消即可。总复杂度 \(O(n\log n)\)

NOIP2022 建造军营

先缩边双,考虑钦定建造军营的点集 \(S\),那么树上这个点集的虚树内的边都要被选中。设虚树中边数为 \(x\),缩点后树上某个点 \(u\) 内部实际的点数为 \(c_u\),那么这个 \(S\) 的贡献就是

\[2^{m-x}\prod_{u\in S}(2^{c_u}-1) \]

现在我们要对一棵树上的这玩意求和。

先把 \(2^m\) 提出来,考虑设 \(f(u,1/0)\) 表示以 \(u\) 为根的所有虚树中包含/不包含 \(u\) 的贡献和。

考虑包含 \(u\) 的虚树,设 \(u\) 有若干儿子 \(v_1,\cdots,v_k\),考虑某个儿子 \(v_i\),在 \(v_i\) 这个子树中的某种选择虚树的方案中,若其根为 \(x\),则贡献为 \(f(x,1)\times2^{\text{dep}(u)-\text{dep}(x)}\)。记录 \(g(u)=\sum_{x\in \text{subtree}(u)}2^{-\text{dep}(x)}(f(x,1)+f(x,0))\) 即可。那么 \(f(u,1)\) 就是所有儿子的 \(g(v_i)\times 2^{\text{dep}(u)}+1\) 的乘积,再乘上 \(2^{c_u-1}\)

考虑 \(f(u,0)\),发现相当于要从至少两个儿子里选点,那么只要减去只选了一个儿子的情况就行了。

所以说四个简单题的 NOIP 我是怎么打出这么烂的成绩的???太小丑了吧。

NOIP2018 旅行

被诈骗了好久。。。

显然起点一定是 \(1\)。树的情况是好做的。考虑基环树的情况。

发现至多一条边不在 DFS 生成树上,枚举这条边即可,复杂度 \(O(n^2)\)

SXOI2022 小 N 的独立集

有个暴力:\(f(u,x,y)\) 表示给以 \(u\) 为根的子树填数,选 \(u\) 时的最大权独立集大小为 \(x\),不选 \(u\) 时为 \(y\) 的方案数。转移就直接写一下树上最大权独立集那个 DP,有

\[f(u,x_1,y_1)\times f(v,x_2,y_2)\to f(u,x_1+y_2,y_1+\max(x_2,y_2)) \]

发现复杂度是 \(O(n^3k^4)\)

然后发现,当 \(x\le y\) 的时候记录 \(x\) 没有意义,若 \(x>y\),那么 \(x-y\le k\)。因此可以记录 \(f(u,j,y)\) 表示以 \(u\) 为根的子树填数,选 \(u\) 时的最大权独立集大小为 \(y+j\)\(j>0\)) 或者 \(\le j\)\(j=0\)),不选 \(u\) 时为 \(y\) 的方案数。转移式类似:

\[f(u,j_1,y_1)\times f(v,j_2,y_2)\to f(u,\max(0,j_1-j_2),y_1+y_2+j_2) \]

复杂度 \(O(n^2k^4)\)