2020 Summer #5
0x01 Pashmak and Parmida's problem
预处理 \(f\),统计各取值个数,维护前缀和.
0x02 Closest Equals
预处理上一个和下一个与 \(a_i\) 相同的数的下标 \(pre_i\) 和 $next_i \ $.
线段树维护 $i-pre_i \ $.
将询问按左端点升序排序,对于 \(i < l\),修改 \(next_i\) 处的值为 \(\infty\),之后求区间最小值.
0x03 Thwarting Demonstrations
不难想到二分答案,设为 $x \ $.
区间和 \(\to\) 前缀和之差,需求 \(\geqslant sum_i + x\) 的 \(sum_j\) 个数,排序后二分或树状数组.
0x04 Little Elephant and Inversions
注意到对于一定的 \(l\),若 \(r\) 满足条件,则 \(r+1,\ r+2,\ \ldots,\ n\) 均满足条件,则 \(l\) 增大时 \(r\) 不减,二分或双指针.
0x05 XOR on Segment
拆位,对每一位维护线段树.
0x06 Sereja and Brackets
线段树维护区间内不能匹配的左右括号个数.
0x07 Ant colony
注意到当且仅当某个数等于区间 \(\gcd\) 时才能整除所有其他数.
线段树维护区间最小值与个数,以及 $\gcd , $.
0x08 Parking Lot
可将连续的空车位作为区间维护,每次取出最长的区间,再插入两个长度减半的区间.
亦可转化为最大子段和问题,用线段树实现.
0x09 Sum of Medians
离散化后对值域维护线段树.
设 \(sum(i, j)\) 表示值为 \(j\),位置模 \(5\) 余 \(i\) 的数总和,\(last(j)\) 表示最后一个值为 \(j\) 的数的位置.
则 add x 操作相当于令 \(last(x) \gets last(x) + 1\),再令 \(sum(last(x) \bmod 5, x) \gets sum(last(x) \bmod 5, x) + x\),且 \(\forall \ y > x\),令 \(sum(i, y) \to sum((i+1) \bmod 5, y)\),del x 同理.
0x0A Lucky Queries
注意到 47 分别替换成 01 对答案无影响,LNDS,即最长不下降子序列必然形如 0...01...1.
用线段树维护区间内 LNDS、包含右端点的最长全 0 子序列、包含左端点的最长全 1 子序列.
注意到取反后 LNDS 变为 LNIS,即最长不上升子序列,形如 1...10...0,维护之即可处理取反.
0x0B Gripping Story
不难想到暴力:维护一个队列,每次取队头机械臂,把它能拿到的所有机械臂入队,然后弹出.
以线段树为例,维护二维偏序,以质量为下标,每个节点维护区间内距离递增的栈,每次查询尽量拿,拿过的标记避免重复.
0x0C Shave Beaver! Easy & Hard version
询问等价于求 \(x,\ x+1,\ \ldots,\ y\) 这些数在排列中最少能形成多少个连续上升子序列.
某个数 \(k\) 能作为子序列右端点,当且仅当 \(k\) 的位置在 \(k+1\) 之后.
则每次交换只会影响 \(a_x-1,\ a_x,\ a_y-1,\ a_y \,\),询问即求区间和.
线段树或树状数组维护,询问时特判 \(y \,\).
0x0D Misha and Permutations Summation
引理:康托展开.
一个排列 \(\{ p_n \}\) 的字典序排名为 \(\displaystyle\sum_{i = 1}^n sum(p_i) \cdot (n-i)!\),其中 \(sum(p_i)\) 表示 \(i\) 之后小于 \(p_i\) 的数的个数.
显然 \(sum(p_i)\) 可通过树状数组或线段树求,之后类似高精度加法.
0x0E Chemistry Experiment
离散化后在水银体积的值域上建线段树,维护某一值域内水银体积的和.
二分答案.
0x0F Subsequences
设 \(f(i, j)\) 表示以 \(a_i\) 结尾长度为 \(j\) 的上升子序列个数.
则 \(\displaystyle f(i, j) = \sum_{k < i,\ a_k < a_i} f(k, j-1)\),树状数组或线段树优化.
0x10 Watching Fireworks is Fun
设 \(f(i, j)\) 表示放第 \(i\) 个烟花时在区域 \(j\) 的最大开心值.
则 \(\displaystyle f(i, j) = \max_{|j-k|\leqslant d(t_i - t_{i-1})}\{ f(i-1, k) \} + b_i - |a_i - j|\).
注意到此时会 MLE,考虑用滚动数组优化第一维状态.
当我们枚举 \(j \in [1, n]\) 时,合法的 \(k\) 区间随之右移;若存在 \(k_1 < k_2 \leqslant j+d(t_i-t_{i-1})\),且 \(f(i-1, k_1) < f(i-1, k_2)\),则 \(k_1\) 必不会对之后的 \(j\) 产生贡献,可以舍去.
单调队列维护 \(\max\{ f(i-1, k) \}\).
0x11 Linear Kingdom Races
线段树优化 DP.
设 \(f(i)\) 表示前 \(i\) 条路中修若干条的最大收益,则
-
若不修路,则 \(f(i) = f(i-1)\).
-
若选一段路修,则 \(\displaystyle f(i) = \max_{0 \leqslant j < i}\{ f(j) + race(j+1, i) - cost(j+1, i) \}\).
其中 \(race(j+1, i)\) 和 \(cost(j+1, i)\) 分别表示修好 \((j, i]\) 中的路后举行比赛能赚到的钱和修路的花费.
考虑对每个位置 \(j\) 维护 \(f(j) + race(j+1, i) - cost(j+1, i)\) 的值,记为 \(v_j \,\).
枚举到新的 \(i\) 时:
- \(\forall \ j \in [0, i)\),将 \(v_j\) 减去第 \(i\) 条路的花费.
- 若 \(i\) 为某场比赛的右端点,即 \(ub_k = i\),则 \(\forall \ j \in [0, lb_k)\),将 \(v_j\) 加上 \(p_k \,\).
- 取 \(\displaystyle f(i) = \max\{ f(i-1), \max_{0 \leqslant j < i}\{ v_j \} \}\).
则我们需要一种支持区间修改、求区间最值的数据结构,用线段树实现.

浙公网安备 33010602011771号