2024 暑假训练(2024-08-18~)

OI

因为每次建一个文章太麻烦,所以整合到一起了。

2024-08-18

to

求一个表达式的期望值,每个数互不相同。

学到了一个东西:期望可加:\(E(X+Y)=E(X)+E(Y)\)

也就是:\(E(abc+abd)=E(abc)+E(abd)\)

很神奇,然后两个部分就互不影响了。

分数

求繁分式的一部分的值。

应该会有一个直观的感受,可以建出一个分治树,然后树上做:\(O(q dep)\)

但是我们发现 \([l,r]\) 的答案就是 \(l-1\) 的点到 \(lca\) 的链上所有不在该链上的右儿子,与 \(r+1\) 的点到 \(lca\) 的链上所有不在该链上的左儿子。

      *
     / \
    *   *
   / \ / \
   * B C *
  / \   / \
l-1 A  r+1 *

字母的都是答案,那么就是 \(AB^{-1}C^{-1}\)

然后 \(l-1\) 的答案是 \(AB^{-1}C^{-1}D^{-1}E^{-1}F^{-1}\cdots\) 的。

\(r+1\) 的答案是 \(A^{-1}BC^{-1}DE^{-1}F\cdots\) 的。

大力维护就好了,注意如果 \(l-1\) 不存在那么 \(r+1\) 的答案要取负数。

这是一种分治优化的套路,建出分治树然后用 \(l-1\)\(r+1\) 与它们的 \(lca\) 计算答案。答案就是链上所有不在该链上的左/右儿子。

还有一个优化:这道题不需要再用 st 表求 lca,不然会爆空间。这里分治的 mid 是区间最大值,所以我们可以求 \(l-1\)\(r+1\) 区间最大值找到 \(mid\) 是这个值的节点就可以了。


\(O(n)\) rmq:本质就是分块,见由乃救爷爷。

2024-08-20

树上选点

很妙的 dp。

我们朴素的想法是记录 \(f_{u,i,j}\) 表示第 \(u\) 个节点有 \(i\) 个点被染色,\(j\) 个点是好的。转移显然。

然后发现当 \(j\ge1\) 时,\(i\) 必定大于等于 \(k\),所以记录 \(f_{u,i}\) 表示第 \(u\) 个节点有 \(i\) 个点被染色,\(0\) 个点是好的,记录 \(g_{u,i}\) 表示第 \(u\) 个节点有 \(\ge k\) 个点被染色,\(i\) 个点是好的。转移就很容易了。

这种题目需要注意的是发掘性质,发现无用的状态,将其优化掉。

排列

发现前两个都是确定性的,最后一个不确定,

所以就是三种方案:冒泡排序、倒序后冒泡排序,随机选择后冒泡排序。

设答案为 \(ans\),我们随机选择时有两种情况:劣的与不劣的。

对于劣的,我们再随机一次,不劣的直接冒泡。

所以我们考虑什么时候叫做不劣的,枚举这个不劣的界限即可。

金鱼草(snapdragon)

签到题,用类似扫描线的思想维护。

思考:可以上树吗?

【TODO】

2024-08-21

傻逼构造不给 spj 害的我忘记输出 Yes

以后还是要细心细心再细心!

考虑蛇形构造即可。

1 4 5 8
2 3 6 7
9 12 13 16
10 11 14 15

对 FWT 的理解又进了一步!

如果你做过 nim 游戏相关问题,容易发现这类 nim 游戏基本都是使用 fwt 的异或卷积来求解。最后答案就是除 \(0\) 以外所有卷积的结果(因为异或为 \(0\) 先手输)。所以我们考虑使用异或卷积。


这里有一个子问题:Nim Counting

根据玩 Nim 游戏的经验,可以发现先手获胜当且仅当 \(\bigoplus_{i=0}^n A_i\neq 0\)

所以我们定义 dp 式子 \(f_{i,j}\) 表示有 \(i\) 个石堆,且石堆异或和为 \(j\) 的获胜方案数,有: \[ f_{i-1,j}\to \sum_{k=1}^Kf_{i,j\oplus a_k} \]

答案就是 \(\sum_{i=1}^n\sum_{j\neq0} f_{i,j}\)

直接转移是朴素的,发现上面的式子刚好是 FWT 异或操作,也就是: \[ f_{i,j}=\sum_{k\oplus x=j} f_{i-1,k}a_x \] 我们定义 \(a\) 是一个全是 \(1\) 的数组即可。

同时,我们发现其实不需要真的进行 \(n\) 次卷积,其实只需要利用 FWT 的线性性,将 FWT 变换过之后的结果 \(A\),求出 \(A+A^2+A^3+\cdots+A^n\) 即可。


这题的 nim 游戏变种也不难可以推理出先手胜的要素。枚举所有石子的异或和,先手赢等价于没有一堆石子个数与所有石子的异或和相等。

那么不难发现我们可以枚举石子异或和,然后不取我们枚举的值的石子,那么就一定可以胜。

\(p\) 表示 \(a\) 对应的概率数组。设 \(f_{t,i,j}\) 表示钦定了异或和为 \(t\),有 \(i\) 个石堆,且石堆异或和为 \(j\) 的获胜概率。

那么有: \[ f_{t,i-1,j}\to \sum_{k=1}^n[k\neq t]f_{t,i,j\oplus k} \] 答案就是 \(\sum_{i=0}^\infty f_{t,i,t}\)

然后你发现你又会了。 枚举 \(t\),对于每个 \(t\),将 FWT 变换过之后的结果 \(A\),求出 \(A_t^0+A_t^1+A_t^2+A_t^3+\cdots+A_t^\infty\) 即可。

不难发现上面的值是一种 \(\bf Sequence\) 构造。答案就是 \(\frac{1}{1-A_t}\)


现在我们可以做到 \(O(n^2\log n)\)

但是我们发现每次产生的变化无非就是 \(p_t=0\),所以暴力做一位就好了。

同时逆变换后的答案也可以暴力求,因为只要 \(A_t\) 的值。

再使用线性求逆元就可以做到 \(O(n^2)\) 了。

思考:可以进阶到多维吗?

【TODO】

2024-08-24

基础题

傻了,以后要记得线段树维护不了区间翻转。

浪费了半个小时。

平衡树才可以。

深入了解了平衡树的维护过程。

吉滪金錀

本质是一个非常重要的转换:当 \(B_i=A_{i+1}-1,B_{i+1}=A_i+1\),代价为 \(A_i+A_{i+1}\),要使得序列单调不增,可设 \(C_i=A_i-i\),直接交换代价为 \(C_i+C_{i+1}+2i+1\),使得序列单调下降(感受一下)。

所以拿数据结构模拟一下即可。

矩阵

题解写得依托答辩。


先考虑怎么判定是否有解:对于一个点对,只有两种情况:在两个序列中的前后关系相同(简写为 \(W\) 点对)或者不同(简写为 \(Z\) 点对)。那么 \(W\) 点对要么对两种序列都产生 \(1\) 的贡献,要么都不产生贡献,\(Z\) 点对会对两种序列中的一种产生 \(1\) 的贡献。

W Z
Z W

如表,两个 W 组成一个 \(W\) 点对,两个 Z 组成一个 \(Z\) 点对。

我们计算 \(W\) 点对数量 \(Wmax\)\(Z\) 点对数量 \(Zmax\)。梳理一下,\(Wmax\) 是可选的,会对 \(X,Y\) 都减 \(1\)\(Zmax\) 是必选的,会对 \(X\)\(Y\) 的一个减 \(1\)

所以我们肯定是先使用 \(Zmax\)\(X\)\(Y\) 减成一样的,最后再使用 \(Wmax\)\(X\)\(Y\) 减成 \(0\)(因为 \(Wmax\) 是可选的,所以不一定要用完)。如果可以剪完,那么就合法,如果不能或减成小于 \(0\),就不合法。


此时我们计算能对 \(X\) 产生贡献的 \(W\) 点对数量 \(Wcnt\),能对 \(X\) 产生贡献的 \(Z\) 点对数量 \(Zcnt\)

容易发现,如果 \(0\le Wcnt\le Wmax,0\le Zcnt\le Zmax\),这种方案就是可实现的。

所以说,我们需要实时维护 \(Wcnt,Wmax,Zcnt,Zmax\),如果进行一个操作后,它依旧满足上面的式子,这个操作就是合法的,否则就是不合法的。

我们从小到大向表格中填入数字,当填入 \(x\) 时,表格中已经填入的数一定都小于 \(x\)

* * * *
* * *
* * * *
*
+
* *
* *
* * * *
* *

如表,当我们向 + 填入数字,表格中标 * 都是在之前填入过数字的(换句话说,比 + 小的)。那么 + 左上角的 * 与它组成一个 \(W\) 点对,而且因为这些位置还未填入,所以会比 + 大,会对 \(Wcnt\) 产生贡献,也会对 \(Wmax\) 产生贡献。

+ 右下角的 * 与它组成一个 \(W\) 点对,而且因为这些位置还未填入,所以会比 + 大,不会产生逆序对,不会对 \(Wcnt\) 产生贡献,但会对 \(Wmax\) 产生贡献。

+ 左下角的 * 与它组成一个 \(Z\) 点对,而且因为这些位置还未填入,所以会比 + 大,不会产生逆序对(对于 \(X\)),不会对 \(Zcnt\) 产生贡献(注意我们对 \(Zcnt\) 的定义是能对 \(X\) 产生贡献的 \(Z\) 点对数量),但会对 \(Zmax\) 产生贡献。

+ 右上角的 * 与它组成一个 \(Z\) 点对,而且因为这些位置还未填入,所以会比 + 大,会产生逆序对(对于 \(X\)),会对 \(Zcnt\) 产生贡献,会对 \(Zmax\) 产生贡献。

也就是说,我们进行完这些操作后,\(Wcnt,Wmax,Zcnt,Zmax\) 会发生改变,如果 \(0\le Wcnt\le Wmax,0\le Zcnt\le Zmax\),刚刚向 + 填入数字就是合法的。

我们有一个朴素的想法,枚举填入的数字与位置,可以做到 \(O(n^4\log^2 n)\),后面的 \(\log\) 是求四角非 * 的数量用的树套树。


考虑优化,我们有一个非常强大的结论:对于当前满足条件的 \(Wcnt,Zcnt\),在当前还未填入的点中,\((x,y)\) 最大/最小、\((y,x)\) 最大/最小的四个(可能更少)的点中(括号表示比较优先级),必然有一个可以归纳下去。

* * * A
*
*
*
B
D
*
*
C * * * *
* * * * * * * * * *

如表,* 都是在之前填入过数字的,那么目前 A,B,C,D 一定有一个是合法的。

考虑证明,我们将点两两分组,假设 A,B 为一组,C,D 为一组,那么 A,B 会让 \(Wmax\) 减去右下角还没被删的点数 \(x1\)C,D 会让 \(Wcnt,Wmax\) 减去左上角还没被删的点数 \(x2\),如果都不满足条件,那么有 \(Wcnt>Wmax-x1,Wcnt-x2<0\),也就是 \(Wmax \le x1+x2-2\),但 \(Wmax\)\(W\) 点对数量 \(Wmax\),显然会有 \(Wmax>x1+x2-2\),所以不合法了。

\(Z\) 同理,我们就 AD,BC 分组即可。

所以说,四个点中必定存在一个点合法,我们就可以做到 \(O(n^2\log^2 n)\) 了,4 倍常数。

2024-08-24

math

阈值分治,hjy 出过题。当大小大于 \(\sqrt n\) 时,个数不会超过 \(\sqrt n\) 个,可以直接暴力,当大小小于 \(\sqrt n\) 时,直接暴力也不会超时。

然后就可以了。

kami

这里

使用了这个结论,类似数位 dp 地,当这一位限制为 \(1\),我们取 \(0\) 时,后面就可以随便取,枚举 \(popcnt=i\),如果 \({n\choose i} \bmod 2=1\),那么就会对答案产生贡献,容易发现我们枚举 \(n\) 的子集暴力即可,复杂度不会证。

思考:这道题是一个类似于 \(\bigoplus_{n\and i=n} (i+x)\) 的模型,有其他更快的解法吗?

graph

整体二分好题。

我们考虑对时间轴分治,设 \(solve(l,r,E)\) 表示我们处理到 \(l,r\) 的时间,当前有用的边集为 \(E\),我们要处理 \(mid\) 的答案,我们就对 \(e\le mid\) 加入 tarjan 跑一次(注意我们已经把 \(1\sim l-1\) 的缩点完了),找出 \(mid\) 的答案,然后对于一个 \(e\le mid\),如果它对左边的强连通没有贡献,我们就算加入它也没用,所以我们就不把它加入左边的边集。如果它对左边的强连通有贡献,我们处理右边时已经把左边的缩点完了,加入也没用,所以我们就不把它加入右边的边集。

复杂度不会证明。

本文作者:ZnPdCo

本文链接: https://znpdco.github.io/blog/2024/08/20/2024-summer-train/

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论