ARC194 做题记
A (Operations on a Stack)
题意
给定一个长度为 \(N\) 的整数序列 \((A_1, A_2, \ldots, A_N)\)。此外,存在一个栈 \(S\),初始时 \(S\) 为空栈。
对于 \(i = 1, 2, \ldots, N\) 的每个步骤,按顺序执行以下两种操作中的恰好一种:
- 将 \(A_i\) 作为元素添加到 \(S\) 的末尾。
- 删除 \(S\) 末尾的元素。注意当 \(S\) 为空时不能选择此操作。
请输出所有操作结束后,栈 \(S\) 中元素总和的可能最大值。
\(1 \leq N \leq 2 \times 10^5,\vert A_i \vert\leq 10^9\)
题解
考虑不在的,注意到相邻两个捆绑,随便线性 dp 做完了。
B (Minimum Cost Sort)
题意
给定一个排列 \(P = (P_1, P_2, \ldots, P_N)\),它是 \((1, 2, \ldots, N)\) 的一个排列。高桥君可以对 \(P\) 进行以下操作任意次(包括零次):
- 选择一个满足 \(1 \leq i \leq N-1\) 的整数 \(i\)。支付成本 \(i\) 后,交换 \(P_i\) 和 \(P_{i+1}\) 的值。
请求出将 \(P\) 按升序排序所需支付的最小总成本。
\(2 \leq N \leq 2 \times 10^5\)
题解
设 \(x_i\) 为位于 \(P_i\) 左侧且比 \(P_i\) 大的数的个数,一个很显然的性质是,\(P_i\) 至少要向左交换 \(x_i\) 次,否则肯定不是升序。
那么贡献就很好算了,累加从目标位置到 \(i\) 的贡献,由等差数列求和公式得贡献为 \(x_i \times i - \frac{x_i \times (x_i+1)}{2}\),然后用一个树状数组维护 \(x_i\) 即可。
C (Cost to Flip)
题意
给定两个仅由 \(0\) 和 \(1\) 组成的长度为 \(N\) 的整数序列 \(A = (A_1, A_2, \ldots, A_N)\) 和 \(B = (B_1, B_2, \ldots, B_N)\)。
你可以对 \(A\) 进行任意次(包括零次)如下操作:
-
选择一个满足 \(1 \leq i \leq N\) 的整数 \(i\),将 \(A_i\) 的值反转(若原值为 \(0\) 则改为 \(1\),若原值为 \(1\) 则改为 \(0\))。
-
支付操作成本 \(\sum\limits_{k=1}^N A_kC_k\) 元。注意:此处的 \(A\) 是步骤 \(1\) 修改后的值。
请求出将 \(A\) 变为 \(B\) 所需支付的最小总成本。
\(1 \leq N \leq 2 \times 10^5,A_i, B_i \in \{0, 1\},1 \leq C_i \leq 10^6\)
题解
考虑贪心:\(0 \to 0\) 不用操作。\(1 \to 0\) 肯定尽可能先操作,\(0 \to 1\) 尽可能后操作。\(1 \to 0\) 的按 \(c_i\) 从大到小操作,\(0 \to 1\) 的按 \(c_i\) 从小到大排序。
但是注意到如果不管 \(1 \to 1\) 的,那么总收益会加上 \(n \times c_i\), \(c_i\) 很大就寄了。
所以我们会将 \(1 \to 1\) 的先改成 \(0\) 再改成 \(1\)。换言之把 \(1 \to 1\) 的拆成 \(1 \to 0\) 的和 \(0 \to 1\) 的。
注意到如果拆的话肯定先拆 \(c_i\) 大的再拆 \(c_i\) 小的。于是将 \(1 \to 1\) 的按照 \(c_i\) 从大到小排序,然后枚举拆前几个。
随便用啥树状数组维护即可,复杂度 \(\mathcal{O}(n\log n)\)。
D (Reverse Brackets)
题意
给定一个长度为为 \(n\) 的合法括号串,求有多少个区间,满足 反転 后括号串仍然合法。
- 反転 定义为区间
(和)互换,然后区间左右翻转。
\(2\le n\le {\color{red}{5\times 10^5}},2\mid n\)
题解
首先考虑把括号序变成树状结构,由于每一括号序都唯一对应一棵树,那么答案就是对每个节点可以重排儿子,问有多少种树的形态。
但是树可能会重复,我们可以用树哈希去重,然后来求答案。
同构完随便组合数算一算。复杂度是高贵的线性!
E(Swap 0^X and 1^Y)
题意
给定两个长度为 \(n\) 的 \(01\) 串 \(S,T\)。给定 \(n,x,y\)。
定义一次操作为交换连续相邻的 \(x\) 个 \(0\) 和 \(y\) 个 \(1\)。
即 \(000011111\to 111110000\) 或 \(111110000\to 000011111\)。
问能否经过若干次操作使得 \(S=T\)。输出 Yes 或 No。
\(1\le x,y\le n\le 5\times 10^5\)
题解
首先经典套路,由于操作可逆,只需判断 \(S,T\) 能变成的 字典序最大/小 的串是否相同即可。
如何分别求出两个能操作成的 字典序最大 的串?
对于每个连续段考虑,每个 \(0/1\) 连续段 \(\bmod x/y\) 的值始终不变,于是拆成 \(x\left\lfloor \frac{L}{x}\right\rfloor\) 整体和 \(L\bmod x\) 个 \(0\) 两部分。
然后可以换的就是 \(0\) 整体和 \(1\) 整体,\(0/1\) 整体和单个 \(0/1\)。
接下来求最大的串就是如果能换 \(x\) 倍数和 \(y\) 倍数部分,一定换。
否则 \(0\) 整体和单 \(0\) 任意换,\(1\) 整体和单 \(1\) 任意换,再看是否能换完。
从前往后扫描,\(1\) 整体一定能向前走就向前走,\(0\) 整体一定向后走就向后走,贪心即可。
- 可是,发现不是那么好维护,可能要 \(n\log n\) 甚至上平衡树。但反正肯定是可以做的。
但是我们只需判断相等,有更优秀的做法。
先判掉 \(01\) 个数不等。
只要考虑如下三个序列: 单个 \(01\) 构成的子序列;所有相邻 单 \(1\) 之间,\(0\) 整体包含的 \(0\) 的个数;所有相邻 单 \(0\) 之间,\(1\) 整体包含的 \(1\) 的个数。
如果 \(S, T\) 的上述三个序列都相等,则 \(S' = T'\)。
证明首先考虑 \(01\) 的子序列是不能交换的,然后 \(1\) 之间 \(0\) 整体全部只能放在 \(1\) 之前,\(0\) 之间 \(1\) 整体全部只能放在 \(0\) 之后。
复杂度是高贵的线性!

浙公网安备 33010602011771号