日记 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\),即我们计算

\[\binom {i-1}{k-1}\binom{i}{k-1}/k \]

考虑将 \(a[]\) 对应回去。即将上升段、下降段拆开放回去,但是一个 \(a_i\) 不能同时被塞上升段和下降段,对此考虑扩展插板法。考虑 \(2i\) 个点排成一排,欲以 \(n-1\) 个板插入 \(2i+1\) 个空,但要求上升与下降的分界处有至少一个板,这里一共有 \(2k-1\) 个地方被限制,所以无限制的板有 \(n-2k\) 块,有限制的先插进去,然后插板,得到

\[\binom{n-2k+2i}{2i} \]

故答案约为

\[\sum_{i=1}^m\sum_{k=1}^i\binom {i-1}{k-1}\binom{i}{k-1}\binom{n-2k+2i}{2i}/k \]

可用阶乘展开式分离组合数并用 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|)\),然后再将减掉的加回去,就相当于提前帮它们非法掉。由二项式反演还是什么东西,得到答案是

\[\sum_{i=0}^n(-1)^n\binom n i f(n, m-i) \]

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}|\) 变小,所以暴力维护所有谷底,每次拿一段最短的谷底去加即可。

posted @ 2024-05-17 22:03  caijianhong  阅读(64)  评论(0编辑  收藏  举报