抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

比赛地址

A - ><

题意

给定一个长度为 \(N-1\) 的只包含 <> 的字符串 \(S\)

一个非负整数序列 \(a_1,a_2,\ldots,a_N\) 被称为好的当且仅当满足以下条件:

  • \(S_i\)<,则有 \(a_i<a_{i+1}\)
  • \(S_i\)>,则有 \(a_i>a_{i+1}\)

求一个好的序列的元素之和的最小值。

\(N\le 5\times 10^5\)

题解

显然 \(a_i\) 的下界为左边连续 < 的数量与右边连续 > 的数量的较大值。

\(a_i\) 都取这个下界时显然满足条件。

所以直接求出 \(a_i\) 后计算即可。

时间复杂度 \(O(N)\)

代码

B - Two Contests

题意

给定 \(N\) 个区间 \([l_i,r_i]\),将他们分成非空的两组。定义一个区间的权值为这个区间中包含的整点数量,定义一组区间的权值为这组区间的交的权值。

求两组区间的权值之和的最大值。

\(N\le 10^5\)

题解

不妨将所有区间右端点加 \(1\),将权值转化为区间长度。

首先考虑其中一组区间的交为空的情况。为了使得长度之和最大,另一组一定只有一个区间,并且是所有区间中最长的。

接下来考虑两组区间都非空的情况。假设第一组区间为 \(S\),那么答案式子为

\[\min_{i\in S}r_i-\max_{i\in S}l_i+\min_{i\not\in S}r_i-\max_{i\not\in S}l_i\]

\(R=\min r_i,L=\max l_i\),即全局右端点的最小值和全局左端点的最大值。

我们不妨强制 \(\min\limits_{i\in S} r_i=R\),此时又分两种情况。

\(\max\limits_{i\in S} l_i=L\) 时,所有区间都可以被放入 \(S\) 中。所以我们一定会尽可能地把区间放入第一组,将最长的区间放入第二组。

\(\max\limits_{i\in S} l_i\ne L\) 时,考虑枚举 \(\max\limits_{i\in S} l_i=L'\)。由于 \(\min\limits_{i\in S}r_i=R\),是全局最小值,所以放入第一组的区间只需要满足 \(l_i\ge L'\) 即可。我们仍然会尽可能地把满足条件的区间都放入第一组,将其他区间放入第二组。

于是对于这种情况,我们只需要将区间按 \(l_i\) 排序,预处理出 \(r_i\) 的后缀 \(\min\) 后枚举一个前缀放入第一组,可以 \(O(1)\) 计算答案。

时间复杂度 \(O(N\log N)\)

代码

C - Neither AB nor BA

题意

给定一个偶数 \(N\),求通过若干次以下操作可以将字符串 \(S\) 变成空串的,长度为 \(N\) 且只包含 ABC 的字符串 \(S\) 的数量:

  • 选择 \(S\) 中相邻两个字符,并将他们删去。但是不允许删除 ABBA

\(998244353\) 取模。

\(N\le 10^7\)

题解

发现删除相邻两个字符有一些性质:

  • 删除的两个位置奇偶性不同;
  • 删除后其余位置的奇偶性不变。

于是我们可以考虑把所有奇数位的 A 变成 BB 变成 A,这样我们的限制条件相当于变成了不能删除连续两个 A 或连续两个 B

充要条件是 AB 的数量都不超过 \(\frac{N}{2}\)。必要性显然,充分性可以通过每次删除多的字符证明。

于是用容斥计算即可。时间复杂度 \(O(N)\)

代码

D - Balance Beam

题意

\(n\) 条线段,每条线段长度都为 \(1\)。在第 \(i\) 条线段上,A 的速度为 \(\frac{1}{a_i}\),B 的速度为 \(\frac{1}{b_i}\)

A 会将 \(n\) 条线段按他想要的顺序排列形成一条长的线段,并以最左边的点作为起点。

然后 B 会在这条长度为 \(n\) 的线段上等概率随机一个实数点作为起点。

A 获胜的条件是,A 和 B 同时出发后,按给定速度行走,A 能在 B 到达最右边之前的某个时刻追到 B。

求 A 的最大胜率。以最简分数形式给出。

\(n\le 10^5\)

题解

假设已经固定了线段的顺序,显然能使 A 获胜的点一定是一个前缀。

若我们以距最左边点的距离为 \(x\) 坐标,时间为 \(y\) 坐标,可以得到两条折线,其中 A 折线的终点为 \((n,S)\),其中 \(S=\sum a_i\)

为了求出最远的能使 A 获胜的点,我们将 B 折线从 \(x\) 轴下方向上移,直到与 A 折线有交点。此时记 B 折线与 \(x\) 轴的交点为 \((p,0)\),那么 \(p\) 就是最远能使 A 获胜的点。

我们考虑一条新的折线 C,在 A 与 B 的交点左边取折线 B,右边取折线 A,那么 C 是一条从 \((p,0)\) 开始到达 \((n,S)\) 的折线。注意到每个方案都可以对应这样的一条折线,所以我们接下来考虑所有这样的折线。

为了使 \(p\) 尽量大,我们一定会让折线 C 尽量“陡峭”。令 \(k\) 为包含 \(p\) 的线段,在 C 经过的线段中,除 \(k\) 的斜率为 \(b_k\) 以外,斜率上界为 \(\max(a_i,b_i)\)

事实上,我们可以达到这一上界。只要将 \(a_i < b_i\) 的线段放在折线 A 与 B 的交点前面,\(a_i \ge b_i\) 的线段放在后面即可。

于是我们考虑枚举 \(k\),然后按 \(\max(a_i,b_i)\) 从大到小依次加入线段,直到 \(b_k+\sum \max(a_i,b_i)\ge S\)。这可以通过预处理前缀和实现。

时间复杂度 \(O(n\log n)\)

代码

E - Prefix Suffix Addition

题意

有一个初始为 \(0\) 的序列 \(x_1,\ldots,x_n\)

你可以执行若干次以下操作:

  • 选择一个 \(k\ (1\le k\le n)\) 和一个不降的非负整数序列 \(c_1,\ldots,c_k\),执行 \(x_i\gets x_i+c_i\)
  • 选择一个 \(k\ (1\le k\le n)\) 和一个不增的非负整数序列 \(c_1,\ldots,c_k\),执行 \(x_{n-k+i}\gets x_{n-k+i}+c_i\)

求使得 \(x_i=a_i\) 的最少操作次数。

\(n\le 2\times 10^5\)

题解

对于两次前缀加操作,若非零位置有交,一定可以通过调整仍然满足条件,并且不变劣。后缀加同理。

于是问题转化成了求两个序列 \(\{x_i\},\{y_i\}\),满足:

  • \(x_0=y_0=x_{n+1}=y_{n+1}=0\)
  • \(x_i,y_i\ge 0\)
  • \(x_i+y_i=a_i\)

最小化 \(\sum [x_i>x_{i+1}]+[y_i<y_{i+1}]\)

\(f_{i,j}\) 表示前 \(i\) 个数,\(x_i=j\) 时上式的最小值。对于每个 \(i\),有性质:

  • \(f_{i,j}\) 单调不增;
  • \(0\le f_{i,0}-f_{i,a_i}\le 2\)

于是我们记录两个分界点,每次二分两个分界点进行转移即可。

时间复杂度 \(O(n\log n)\)

代码

F - Two Pieces

题意

数轴上有两个点,一开始都在原点。每次你可以执行以下两种操作之一:

  • 选择一个点向右(正方向)移动一个单位;
  • 将左边的点移动到右边的点的位置。

你需要执行 \(N\) 次操作。求最后左边的点在 \(A\),右边的点在 \(B\) 的方案数。

两种方案被认为不同当且仅当某次操作之后两个点的坐标集合不同。

\(N\le 10^7\)

题解

考虑用 \((x,d)\) 来表示一个状态,其中右边的点在 \(x\),两点距离为 \(d\)。相当于有以下三种操作:

  • \(x,d\) 同时加 \(1\)
  • \(d\)\(1\),需要满足操作以后 \(d\ge 1\),即操作前 \(d\ge 2\)
  • \(d\)\(0\)

此时由于第二种操作限制了 \(d\ge 2\),每种操作一定互不相同,所以问题转化为求操作序列数量。

考虑确定前两个操作序列,然后插入第三种操作。

注意到第一种操作恰好执行 \(B\) 次,考虑枚举第二种操作的操作次数 \(k\)。这个方案数可以用折线法进行计算。

然后考虑插入第三种操作。注意到插入后需要满足以下两个条件:

  • 最终 \(d\) 到达 \(B-A\)
  • 不会使第二种操作不合法。

注意到将一个第三种操作插入到 \((x_i,d_i)\) 后,会导致后面的 \(d_j\) 都减 \(d_i\)

为了满足第一个条件,需要保证最后一个第三种操作满足 \(d_i=A-k\)

为了满足第二个条件,需要保证每个第三种操作都满足 \(d_i\) 是后缀的严格最小值,即不存在 \(j\ge i\) 满足 \(d_j \le d_i\)

也就是说,我们可以在最后一次 \(d_i=0,1,2,\ldots,A-k\) 后面连续插入任意数量个第三种操作,并且需要保证 \(d_i=A-k\) 后面一定有一个第三种操作。用隔板法计算即可。

时间复杂度 \(O(n)\)

代码

评论