Loading

The 2nd Universal Cup. Stage 28: Chengdu 题解

比赛链接

A. Add One 2

感觉这个题好难啊。怎么过这么多队。

直接贪心不好做,先考虑什么样的序列 \(x_1,x_2,\dots,x_n\) 是能得到的。

对于每个 \(1\le i<n\),如果 \(x_i>x_{i+1}\),那么至少要在 \([1,i]\) 这个前缀操作至少 \(x_i-x_{i+1}\) 次;如果 \(x_i<x_{i+1}\),那么至少要在 \([i+1,n]\) 这个后缀操作至少 \(x_{i+1}-x_i\) 次。如果倒着做这些操作,那么做完这些操作后所有 \(x_i\) 都会变成一个相同的数,而我们需要这个数非负。

这等价于

\[\begin{aligned} &x_1\ge \sum_{i=1}^{n-1} \max(0,x_i-x_{i+1}),\\ &x_n\ge \sum_{i=1}^{n-1} \max(0,x_{i+1}-x_i). \end{aligned} \]

如果令 \(x_0=x_{n+1}=10^{18}\),那么等价于

\[\begin{aligned} &10^{18}\ge \sum_{i=0}^n \max(0,x_i-x_{i+1}),\\ &10^{18}\ge \sum_{i=0}^n \max(0,x_{i+1}-x_i). \end{aligned} \]

由于这两个式子的值是一样的,加起来得到

\[2\times 10^{18}\ge \sum_{i=0}^n |x_i-x_{i+1}|. \]

对于原来的序列 \(y\),能做的操作是每次选一个位置加上 \(1\),问最少进行多少次操作才能使得 \(y\) 满足上述条件。

对于 \(y\) 中的一段 \(y_l=y_{l+1}=\dots=y_r\),如果 \(\min(y_{l-1},y_{r+1})>y_l\),那么将 \([l,r]\) 这一整段都加上 \(1\),就可以使得绝对值之和减少 \(2\)。那么每次选择长度最小的这样的段进行操作即可,可以用堆维护。

\(O(n\log n)\)

C. Colorful Graph 2

给出的是正多边形的一个三角剖分的一部分,所以不妨考虑如果给的是完整的三角剖分,应该怎么做。

显然只需要考虑所有三元环,如果在有公共边的三元环之间连边,会形成一棵树,先任选一个三元环随便染色,然后和它有边相连的三元环只有一个点没有被染色,而且这个点有至少一种染色方式。所以按照这棵树的某个拓扑序进行染色即可。

\(O(n\log n)\)

D. Min or Max

模拟。

F. Whose Land?

扫描线扫右端点 \(r\),设 \(t_i\) 表示最大的 \(u\le r\),使得点 \(u\)\(k\) 邻域内包含点 \(i\)。我们希望用数据结构维护对于每个 \(x\),有多少个 \(i\) 满足 \(t_i=x\),这样回答询问就是简单的。

和 JOISC 2022 洒水器一样,可以把点 \(u\)\(k\) 邻域拆成 \(O(k)\) 个形如“在某个点的子树内且深度恰好是某个值”的不交并,所以对于每个深度,用 set 维护连续段即可。

\(O((nk+q)\log n)\)

G. China Convex Polygon Contest

首先做题顺序肯定是按照 \(b_i\) 从小到大做,不确定的是什么时候交题。设 \(b_1,b_2,\dots,b_n\) 排序以后的前缀和是 \(s_1,s_2,\dots,s_n\)

对于一段 \([a_i,a_{i+1})\),设落在这段区间内的是 \(s_l,s_{l+1},\dots,s_r\),那么有两种选择:

  • \(s_l,s_{l+1},\dots,s_r\) 都用于匹配 \(i+1\) 以后的提交;
  • \(s_l\) 用于匹配 \(a_i\)(可能匹配不全),\(s_{l+1},\dots,s_r\) 用于匹配 \(i+1\) 以后的提交。

如果某个 \(s_i\) 匹配了一个 \(a_j\ (j>i)\),那么落在 \([a_j,a_{j+1})\)\(s_k\) 一定不会选择匹配 \(a_j\)

所以按照 \(i\) 从大到小考虑 \([a_i,a_{i+1})\) 中的所有 \(s_j\),每次可以尝试反悔掉一些匹配自身的,或者直接匹配一个空的段 \([a_x,a_{x+1})\)。需要用线段树维护区间 min。

\(O(n\log n)\)

H. The Game

最后还剩两个数时,如果这两个数相同,那么 Kevin 就输了。而且发现这是充要的,所以做完了。

J. DFS Order 5

模拟。

K. Sticks

先考虑判定一个 \(n\times m\) 的矩阵 \(M\) 是否能得到。

每次尝试消去最后一行,我们会选择一段前缀 \(M_{n,1}=M_{n,2}=\dots=M_{n,k}=1\),钦定这一段是从左端伸出来的。那么对于 \(M_{n,k+1},\dots,M_{n,m}\),如果其中一个 \(M_{n,j}\)\(1\),那么它一定是从顶上延伸下来的。找到最小的一个这样的 \(j\),列 \(j,j+1,\dots,m\) 都一定只有从顶上延伸下来的木棍,剩下的是一个子矩阵 \(M_{1\dots (n-1),1\dots (j-1)}\)

发现每次一定可以选最大的满足条件的 \(k\),因为如果 \(M_{n,k+1}=1\),那么它一定是从顶上延伸下来的,但将它调整成从左边延伸过来是不会改变任何事情的。

于是在判定过程中,行数和列数的变化是确定的,直接把这个过程写成 DP 即可。

\(O(n^2)\)

M. Bot Friends

我们要找到机器人和洞之间的一个匹配,那么考虑一个匹配能否得到。发现充要条件是任意两组匹配要么包含要么不交。

所以匹配形成了一个括号树,我们需要最小化叶子的个数。考虑在 \(i+0.5\) 的机器人能否向左匹配任意一个不与它相邻的洞,发现只需要前面有某个机器人把 \(i\) 位置的洞匹配掉就可以。

所以设 \(f_{i,j,0/1}\) 表示考虑了前 \(i\) 个机器人(不考虑第 \(i\) 个机器人后面的洞),目前有 \(j\) 个向 \(>i\) 的洞匹配的机器人,且第 \(i\) 个机器人是/不是向后匹配的最小叶子个数。转移时先考虑 \(i+1\) 这个洞如何匹配,再考虑 \(i+1.5\) 这个机器人如何匹配即可。

\(O(n^2)\)

posted @ 2024-04-17 13:40  Alan_Zhao_2007  阅读(140)  评论(0编辑  收藏  举报