日记 2024.5.17:2024 年 syzx 春季训练 6
pht 0517
2024 syzx 春季训练 6 - Virtual Judge (vjudge.net.cn)
2024 年 syzx 春季训练 6 - 洛谷专栏 (luogu.com)
A. [CF348D] Turtles
给定一个 \(n * m\) 的棋盘,两只乌龟一起从左上角出发,目标是右下角,每次可以向右或者向下走一步。
问有多少种方案,可以使得这两只乌龟在直到终点前的行进过程中彼此不相遇。\(n, m\leq 3000\)
LGV 引理秒了。
C. [ARC123D] Inc, Dec - Decomposition
给出长为 \(n\) 的序列 \(a\),构造长为 \(n\) 的序列 \(b,c\),要求:
- \(b\) 非严格递增。
- \(c\) 非严格递减。
- \(b_i+c_i=a_i\) 。
最小化 \(\sum_{i=1}^n |b_i|+|c_i|\)。
- \(1\leq N\leq 2\times 10^5\)
- \(-10^8\leq A_i\leq 10^8\)
直接三分 \(b_1\) 是对的。
构造一个 \(d_i=-c_i\),变成 \(a_i=b_i-d_i\),\(b[], d[]\) 单调递增。固定住 \(b[], d[]\) 的形状后,可以随意全局加一个数,那是就是希望它们尽量接近 \(x\) 轴。而且你也希望极差尽可能小,所以要么变 \(b_i\) 要么变 \(d_i\),\(b[], d[]\) 的形状是固定的。仔细地说,就是若 \(a_i-a_{i-1}<0\),那么 \(b_i=b_{i-1}, d_i>d_{i-1}\);若 \(a_i-a_{i-1}\geq 0\),那么 \(b_i\geq b_{i-1}, d_i=d_{i-1}\)。
仔细刻画答案形式,实际上是选中位数,因为这个绝对值就是你随意选一个坐标做零,然后求其它所有点到零的距离的和,是经典问题。
D. [ARC138C] Rotate and Play Game
两个人在玩游戏:
- 游戏共有 N(N 是偶数) 张扑克组成,第 i 张扑克上面有一个数 \(A_i\);
- 先手每次可以任意选择一张还没有被选择的扑克;
- 后手每次会老实选择最上面一张扑克;
- 每个人会获得他选中扑克的分数。
先手为了扩大优势(游戏结束时分数尽量大),决定在开始游戏前,切一次牌:把牌堆顶部任意 \(k\) 张扑克放到牌堆底部,即切牌后变成 {\(A_{k+1}, A_{k+2}...,A_N,A_1,...A_k\)}。
问当 \(k\) 选择什么的时候,先手可以获得最多分数,以及该分数是多少。
- \(2 \leq N \leq 2 \times 10^5\)
- \(N\) 是偶数.
- \(1 \leq A_i \leq 10^9\)
- 所有输入值为整数.
答案的上界是前 \(n/2\) 大数的和,事实上答案就取到这个上界。
考虑标记关心的数为 \(+1\),其它数为 \(-1\)。那么我们总可以构造一种循环移位,使得每个前缀和非正,这样就合法了:我们直接找前缀和最大那个点当作开始就可以了。策略就是,先手每次拿一个最早的 \(+1\),后手就能看到一个 \(-1\)(相当于先手每次拿一个右括号,那么后手就会有一个左括号可以拿)。
E. [CF1685C] Bring Balance
Alina有一个长度为$2n$的括号序列$s$,由$n$个开括号'('和$n$个闭括号')'组成。由于她喜欢平衡,她想要将这个括号序列转换成一个平衡的括号序列。
在一次操作中,她可以翻转任意子串$s$。
她需要多少次操作才能将$s$转换成一个平衡的括号序列?可以证明最多需要$n$次操作。
作为提醒,如果一个括号序列可以通过添加字符+和1变成一个有效的数学表达式,则称之为平衡。例如,序列(())()、()和(()(()))是平衡的,而)(、(()和(()))(不是。
对于每个测试用例,在第一行输出一个整数$k$ $(0 \le k \le n)$ — 所需的最小操作次数。
接下来的$k$行中,第$i$行应包含两个整数$l_i, r_i$($1 \le l_i \le r_i \le 2n$),表示在第$i$次操作中,Alina将翻转子串$s_ls_{l+1} \ldots s_{r-1}s_r$。这里的编号从$1$开始。
如果有多个操作序列的长度相同,可以输出其中任意一个将序列转换为平衡序列的操作序列。
实际上答案 \(\leq 2\)。不操作的非常简单,两次操作是因为你可以通过反转 \([1, i]\) 与 \([i+1, n]\) 构造一个循环移位,然后应用 D 的结论。一次操作,考虑若反转 \([L,R]\)。首先 \(L\) 一定不能晚于前缀和中的第一个 \(-1\),其次在此基础上 \(L\) 要落在前缀和最大的地方,方便后面发挥。\(R\) 同理。然后就做完了。令人惊讶。
F. [清华集训2016] 你的生命已如风中残烛
你有 M+1 张牌,其中有 1 张关键牌,沉在牌堆底部。
另外有 N 张特殊牌,他们有过牌的能力:即抽中它之后你可以继续抽接下来的 \(W_i\) 张牌,\(\sum{W_i}\) 恰好等于 M,所以不会爆牌。
问有多少种牌堆的排列,可以使得你抽完第一张牌之后,可以顺利抽到牌堆底部的关键牌(即把所有牌抽光)。
对于 \(100\%\) 的数据,\(n \leq 40\),\(1 \leq w_i \leq 10^5\)。同时保证有 \(m-n \geq 4\),因为牌堆里毕竟要有这 \(5\) 个部件嘛。
Raney 引理:对任意数组 \(a[]\) 满足 \(\sum_{i=1}^na_i=1\),\(a[]\) 恰好只有一个循环移位使得每一个非空前缀和都是正数。方案是,任意选择循环移位,从最后一个前缀和最低点断开作为新的循环排列的第一个数。
所有 \(w_i\) 减一(包括关键牌),则总和恰好为 \(-1\),任意前缀和 \(\geq 0\),相当于任意后缀和 \(\leq -1\)。由 Raney 引理,这样的排列恰好只有一个循环移位是合法的,于是数圆排列 \((m+1)!/(m+1)=m!\)。然后还需要注意最后一张牌必须是关键牌,但是我们数的时候没有区分,应该加一个标号,计算 \(m!/(m-n+1)\) 即可。
G. [QOJ7632] Balanced Arrays
给定 \(n, m\),计数由多少个非负整数数组 \(a\) 使得 \(a_0=a_{n+1}=0\) 时 \(\sum_{i=1}^{n+1}|a_i-a_{i-1}|\leq m\)。\(n, m\leq 500000\)。
枚举 \(\sum_{i=1}^{n+1}|a_i-a_{i-1}|=2i\)(显然必定是偶数),把涉及到的 \(2i\) 个值当作平面直角坐标系的点,枚举有 \(2k\) 个转折点。
考虑分配点坐标。将所有点关于 \(y=m/2\) 对称,若无“每个点都必须在第一象限”的限制,则这部分方案数为 \(\binom{i-1}{k-1}^2\),但是如果有这样的限制,考虑在最前面加入一个 \(+1\),应用 Raney 引理,分好上升段和下降段以后,因为所有 \(k\) 个谷底的地位是等同的,欲将钦定我们加入的 \(+1\) 在最前面,则除以 \(k\),即我们计算
考虑将 \(a[]\) 对应回去。即将上升段、下降段拆开放回去,但是一个 \(a_i\) 不能同时被塞上升段和下降段,对此考虑扩展插板法。考虑 \(2i\) 个点排成一排,欲以 \(n-1\) 个板插入 \(2i+1\) 个空,但要求上升与下降的分界处有至少一个板,这里一共有 \(2k-1\) 个地方被限制,所以无限制的板有 \(n-2k\) 块,有限制的先插进去,然后插板,得到
故答案约为
可用阶乘展开式分离组合数并用 NTT 加速计算。
H. [QOJ7632] Balanced Arrays
给定 \(n\) 和 \(M\)。
起初有一个长度为 \(n\) 的数组 \(a[]\),元素都是 0,每次可以:
- 选择某个前缀区间 +1;
- 选择某个后缀区间 +1。
问经过任意次操作,可以构成多少种不同的数组,满足: \(a_i <= M\)。\(n,m\leq 500000\)。
观察到 G 和 H 的题意是一模一样的,但是我们考虑若使 \(a_0=a_{n+1}=m\),则我们尝试将 \(a[]\) 分解成两个序列 \(b[], c[]\),使得 \(a_i=b_i+c_i\),\(b_0=m, b_{n}=b_{n+1}=0\) 且 \(b[]\) 单调不增,\(c_0=c_1=0, c_{n+1}=m\) 且 \(c[]\) 单调不降,且 \((b_i-b_{i-1})(c_i-c_{i-1})=0\)。就是把每一次操作拆出来了,然后限制 \(b[], c[]\) 是唯一的。然后要求 \(b_i+c_i=a_i\leq m\),要数这样的 \(b[], c[]\) 的个数。
\(b_i+c_i\leq m\) 不好看,令 \(d_i=m-b_i\),则限制转化为:
- \(b_i+c_i\leq m\implies c_i\leq d_i\)。
- \((c_i-c_{i-1})(d_i-d_{i-1})=0\)。
- \(c[], d[]\) 单调不降,\(c_0=d_0=0, c_{n+1}=d_{n+1}=m\)。
若无第二个限制条件,则我们将要求两条从 \((1, 0)\) 走到 \((n+1, m)\) 的路径,满足只能向上或向右走,两条路径可以相交不能穿越。将上面一条路径左移一个单位,上移一个单位,转化为两条不相交路径,应用 A 题做法。将这里的答案记作 \(f(n, m)\)。
加入第二个限制条件,考虑容斥,钦定集合 \(S\) 中的下标满足 \((c_i-c_{i-1})(d_i-d_{i-1})\neq 0\),然后将 \(c[i:n]\) 与 \(d[i:n]\) 集体 \(-1\),然后应用 \(f(n, m-|S|)\),然后再将减掉的加回去,就相当于提前帮它们非法掉。由二项式反演还是什么东西,得到答案是
I. [CCPCF2023] Add One 2
多组询问,每次给定 \(n\),以及一个长度为 \(n\) 的数组 \(b[]\)。
起初有一个长度为 \(n\) 的数组 \(a[]\),元素都是 0,每次可以:
- 选择某个前缀区间 +1;
- 选择某个后缀区间 +1。
每次操作的代价是选中区间的长度。
问最少花费多少代价,可以使得任意的 \(a_i >= b_i\)。数据范围
\(1 <= T <= 10^5, \sum{n} <= 10^6, 0<=b_i<=10^9\)。
由 G 的题面,我们需要找到的是一个 \(a[]\) 满足 \(a_i\geq b_i\),\(a_0=a_{n+1}=m=\max_{i=1}^na_i\) 的时候 \(\sum_{i=1}^{n+1}|a_i-a_{i-1}|\leq 2m\)。因为 \(a[]\) 整体加一或减一不影响合法性,故直接钦定 \(m=\max_{i=1}^nb_i\)。
这里,我们的答案是 \(\sum_{i=1}^na_i\)。考虑我们直接在 \(b[]\) 上调整,将其调整为合法。考虑一段谷底,需要将这一段值相等的谷底全部 \(+1\),才能使 \(\sum_{i=1}^{n+1}|b_i-b_{i-1}|\) 变小,所以暴力维护所有谷底,每次拿一段最短的谷底去加即可。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18198787