2024 改题记录
11.6 集训队胡策题
[集训队互测 2024] R10T3 骨牌覆盖
有一个 \(n\) 列的棋盘,第 \(i\) 列有 \(a_i\) 格。
求有多少个子区间 \([l,r]\) 满足 \(l\sim r\) 列可以被 \(1\times2\) 的多米诺骨牌填充。
多组数据,\(n\le 5\times10^5\),\(\sum n\le 10^6\)。
感性理解、感性理解……
假设有这样两个不相邻的横着的骨牌,那么一列被切成很多份肯定不好,感性理解横着的会贴在一起。
贴着的两个横着的骨牌组成的 \(2\times 2\) 可以被两个竖着的替代。所以贴在一起的最多只有 \(1\) 个。
再感性理解,横着的放底下肯定不劣。
贪心,当前列剩下奇数格就往底下填一个横着的,偶数就不用填。
那么每一列只会增加 \(1\) 个横着的骨牌。
考虑这种情况,第一、第二列都往下填了一个横着的,标⭐的位置就只能填横着的了。
描述这个过程:
- 横着的骨牌数量 \(k\) 初始为 \(0\)。
- 扫一遍所有列。
- 当前列 \(i\) 剩余 \(a_i-k\) 格。
- \(a_i-k\) 是奇数,\(k\gets k+1\);
- \(a_i-k\) 是偶数,\(k\gets \max(0,k-1)\)。
最后合法当且仅当最后 \(k=0\) 且全程 \(a_i\ge k\)。
维护这个过程以计数合法区间数量。
\(\mathbf{解法1}\)
扫描线 \(r\),位置 \(p\) 维护 \(res_p\) 表示区间 \([p,r]\) 最后的 \(k\)。
\(r\) 端点移动 \(r\to r+1\) 时:
对于 \(a_{r+1}-res_p\) 为奇数的 \(p\),\(res_p\gets res_p+1\)
对于 \(a_{r+1}-res_p\) 为偶数的 \(p\),\(res_p\gets \max(0,res_p-1)\)
删去 \(res_p>a_{r+1}\) 的 \(p\)。
维护三个集合:\(res_p\) 是 \(0\)、奇数、非 \(0\) 偶数。
直接上平衡树即可。复杂度 \(O(n\log n)\)。
\(\mathbf{解法2}\)
这是一个类似栈的结构,遇到奇数 push,偶数 pop。
注意到一个 \(a_i\) 对栈的 \(siz\) 贡献 \(\pm1\),栈的 \(siz\) 是连续的。
直接维护两个数组表示奇数、偶数每个 \(siz\) 对应的答案。
需要支持推平、整体偏移和单点修改、单点查询。
推平操作由 \(siz\) 的连续性可以直接暴力。
复杂度 \(O(n)\)。
没实现。
[集训队互测 2024] R1T3 基础 01 练习题
称一对 \(n\times m\) 的
01
矩阵 \((A,B)\) 是“好的”,当且仅当不存在点 \((x1,y1)\) 和 \((x2,y2)\) 满足:
- \((x1,y1)\) 和 \((x2,y2)\) 在同一行或者同一列,即 \(x1=y1\) 或 \(x2=y2\)。
- \(A_{x1,y1}=1\),\(B_{x1,y1}=0\)。
- \(A_{x2,y2}=0\),\(B_{x2,y2}=1\)。
定义一个矩阵 \(A\) 的权值为:
- 有大小相同的 \(B\) 矩阵,初始全为 \(0\)。
- 每次操作选择 \(B\) 若干个 \(0\) 同时变成 \(1\)。
- 每次操作之后 \((A,B)\) 都要是“好的”。
- \(A\) 的权值是最大的操作次数。
给 \(n\times n\) 的
01
矩阵 \(X\),分别 \(X\) 的前 \(i\) 列(\(i\in[1,n]\))组成的子矩形的权值。由于 \(n\times n\) 太大,\(X\) 由特殊方式生成:\(X\) 初始全为 \(0\),对 \(X\) 做 \(q\) 次矩形反转(flip)。
\(1\le n,q\le 2\times10^5\),时限 \(4s\)。
把这个奇怪判定条件对应到图上面。
考虑一个左侧 \(n\) 个点,右侧 \(m\) 个点的有向二分图。
\(A_{i,j}=1\) 则左部点 \(i\) 连向右部点 \(j\),反之右部点 \(j\) 连向左部点 \(i\)。
然后神仙操作就来了,把 \(B_{i,j}\) 作为这条边的边权。
于是判定就是:图上不存在 \(x\xrightarrow{1}y\xrightarrow{0}z\) 的链。
一个强连通分量内部的边只能全 \(0\) 或者全 \(1\),所以强连通分量的边必须同时从 \(0\) 变为 \(1\)。
如果有 \(x\) 个强连通分量内部有边,强连通分量之间有 \(y\) 条边,那么答案即为 \(x+y\)。
兰道定理,对于左部点 \(x,y\),若 \(deg_x>deg_y\)(\(deg\) 是出度),则 \(x\) 可达 \(y\)。
必然存在右部点 \(z\),使得 \(x\to z\to y\)。因为 \(x\to z,y\to z\) 的右部点 \(z\) 最多 \(deg_y\) 个。
给左部点钦定一个顺序,\(deg\) 大的向 \(deg\) 小的连边,相等的随便钦定一个顺序,右部点同理。
于是二分图变成了一个竞赛图。
前 \(i\) 列的查询就是把右部点一个个加入。
\(deg\) 变化非常大,考虑第一次 \(deg_x\ne deg_y\) 的时候,就可以确定 \(x\to y\) 还是 \(y\to x\)。
第一次 \(deg_x\ne deg_y\) 的时候就是第 \(x\) 行和第 \(y\) 行第一个不相等的位置。
这是一个比较字典序的过程,把矩阵每一行按照字典序从大到小排序即可,得到一个 \(rnk\) 数组。
每次加入右部点 \(x\) 时,找到连向 \(x\) 的 \(rnk\) 最小的左部点 \(a\)、\(x\) 连出的 \(rnk\) 最大的左部点 \(b\)。
加入 \(x\) 的影响就是左部点区间 \([a,b]\) 变为一个强连通分量。
主席树+字符串哈希字典序排序,扫描线+线段树维护左部点 \(01\) 序列,区间覆盖 ODT+可并堆 维护。
时间复杂度 \(O(n\log^2n+q\log n)\)。
[集训队互测 2024] R10T1 计算几何
平面上有 \(n\) 个点 \((a_i,b_i)\),\(q\) 次询问 \([l,r]\) 区间内的最近点对距离。
距离是曼哈顿距离。
保证序列中点的坐标和询问区间在指定范围内用指定方式随机生成。
\(1\le n,q\le 10^6\),\(|a_i|,|b_i|\le 10^9\),时限 \(4s\)。
纯纯乱搞题。
分治,\([l,r]\) 区间内按照 \(a_i\) 排序,每个 \(i\) 找前 12 个计算,计算出区间 \([l,r]\) 的最近点对 \((x,y)\)。
询问 \([ql,qr]\) 满足 \(ql\le x\le y\le qr\) 就解决了。
否则往下递归 \([l,y-1]\) 和 \([x+1,r]\)。
11.9 讲题
[ABC221G] Jumping sequence
有一个的平面直角坐标系,初始在 \((0,0)\) 处。
给 \(n\) 次操作,每次给一个数 \(d_i\),你可以往上/下/左/右移动 \(d_i\) 步。
求最后能否到达 \((a,b)\),输出方案。
\(1\le n\le 2000\),\(1\le d_i\le 1800\)。
时限 \(5s\),空限 \(1G\)。
trick:曼哈顿距离转切比雪夫距离。
将点转化为 \((x+y,x-y)\) 的形式,每次操作相当于 \((x\pm d_i,y\pm d_i)\) 任选。
\(a'\gets a+b,b'\gets a-b\),需要分别对 \(a',b'\) 解决 \(\sum\limits_{i=1}^n k_i d_i=C,k_i\in\{-1,1\}\) 的问题。
记 \(S=\sum\limits_{i=1}^n d_i\)。
存在性 01 背包问题,bitset 优化,时间复杂度 \(O(\frac{n^2V}{\omega})\)。
但是这还不够,我们学习科技:\(O(nV)\) 存在性 01 背包。
从前往后贪心地选取物品,直到选不了,即找到最大的 \(pos\) 使得 \(sum=\sum\limits_{i=1}^{pos}\le C\)。
称 \(S=\{1,2,\dots,pos\}\),\(T=\{pos+1,pos+2,\dots,n\}\)。
最终方案一定可以通过当前方案删除若干个 \(S\) 内的物品,加入若干个 \(T\) 内的物品得到。
令 \(D=\max d_i\),那么一定有一个操作顺序使当前选取物品体积和一直在 \((C-D,C+D]\) 内。
当前体积 \(sum\le C\) 则选取 \(x\in T\) 加入 \(x\),否则选取 \(x\in S\) 删除 \(x\)。
不妨假设是从断点 \(pos\) 往两侧操作。
可以 DP,\(f_{l,r,k}\) 表示操作了 \([l,r]\)(\(l\le pos<r\)),当前体积为 \(k\) 是否可能。
初始 \(f_{pos+1,pos,sum}=1\),答案是 \(f_{1,n,C}\),转移如下:
- \(f_{l,r,k}\gets f_{l+1,r,k}\)
- \(f_{l,r,k}\gets f_{l,r-1,k}\)
- \(f_{l,r,k+d_l}\gets f_{l+1,r,k}(k>C)\)
- \(f_{l,r,k+d_r}\gets f_{l,r-1,k}(k\le C)\)
复杂度仍是 \(O(n^2V)\) 或者 \(O(\frac{n^2V}{\omega})\)。
重新设置状态,注意到 \(f_{l,r,k}\) 在 \(l\) 维上有单调性,\(g_{r,k}\) 表示最大的 \(l\) 使得 \(f_{l,r,k}=1\)。
初始 \(g_{pos,sum}=pos+1\),答案是 \([g_{n,C}>0]\),转移:
- \(g_{r,k}\gets g_{r-1,k}\)
- \(g_{r,k+d_r}\gets g_{r-1,k}(k\le C)\)
- \(g_{r,k-d_l}\gets l(k>C,l<g_{r,k})\)
状态数是少了,但是复杂度还是 \(O(n^2V)\)。
注意到
\(g_{r,k-d_l}\gets g_{r-1,k-d_l}\gets l(k>C,l<g_{r-1,k})\)
所以可以
\(g_{r,k-d_l}\gets l(k>C,g_{r-1}\le l<g_{r,k})\)
这样复杂度均摊 \(O(nV)\)。
11.20 讲题
[集训队互测 2024] R8T1 熟练
给一棵 \(n\) 点的树和 \(m\) 条路径,给每条路径染一个颜色,使得任意两条颜色相同的路径不经过相同的点。
求最少需要几种颜色,并构造方案。
多组数据,\(1\le t\le 10^5\),\(1\le n,m,\sum n,\sum m \le 5\times 10^5\)。
结论:答案为被路径覆盖最多次的点的覆盖次数。
答案正确不构造可以获得 15% 的分数,交上去有 15 分说明结论是对的。
设 \(k\) 为最大覆盖次数,令所有覆盖次数为 \(k\) 的点为关键点。
如果能选出若干两两不交的路径,经过所有的关键点,那么重复进行 \(k\) 次该过程必定能构造出方案。
对于所有不存在关键点祖先的关键点 \(x\),必然存在 \(\operatorname{lca}\) 为 \(x\) 的路径。
找出 \(x\) 和这条路径之后递归构造,时间复杂度 \(O(nm)\)。
发现其实只需要找到覆盖次数最大 dfn 最小的点 \(x\),树剖上线段树维护,时间复杂度 \(O(m\log^2 n)\)。
CF1738G Anti-Increasing Addicts
有 \(n\times n\) 的方格,有些方格不可被删除。
给定整数 \(k\) ,要求删除 \((n-k+1)^2\) 个方格,使得不存在 \(k\) 个严格单调递增(横纵坐标均严格单调递增)的方格未被删除或证明其无解。
多组数据,\(n,k\le 10^3\),\(\sum n^2\le 10^6\)。
Dilworth 定理 变为用 \(k-1\) 个单调递减的链覆盖所有保留的格子。
手玩一下,第一条链最多覆盖 \(2n-1\) 个格子,第二条最多 \(2n-3\) 个格子……
以此类推第 \(i\) 条链最多覆盖 \(2(n-i)+1\) 个格子。
则 \(k\) 条链最多覆盖 \(n^2-(n-k+1)^2\) 个格子,限制已最严格。
设 \(f_{i,j}\) 为从 \(i,j\) 开始的只经过保留位置的最长链长度。
构造:
第 \(i\) 条链从 \((n,i)\) 开始,每次向上或向右走,经过未被覆盖的 \(f\) 值为 \(k-i\) 的位置,结尾到 \((i,n)\)。
只需要尽量向上走,就一定能构造。(证明,不知道,感性理解吧)
\(O(n^2)\) 模拟即可。