Loading

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)\)

AC Record

\(\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)\)

AC Record


[集训队互测 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]\)

AC Record


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\}\) 的问题。

\[\sum\limits_{i=1}^n k_i d_i=C,k_i\in\{-1,1\} \]

\(S=\sum\limits_{i=1}^n d_i\)

\[\sum\limits_{i=1}^n k_i d_i=C+S,k_i\in\{0,2\} \]

\[\sum\limits_{i=1}^n k_i d_i=\frac{C+S}{2},k_i\in\{0,1\} \]

存在性 01 背包问题,bitset 优化,时间复杂度 \(O(\frac{n^2V}{\omega})\)

AC Record

但是这还不够,我们学习科技:\(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)\)

AC Record


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)\) 模拟即可。

AC Record

posted @ 2025-02-09 07:17  Mathew_Miao  阅读(17)  评论(0)    收藏  举报