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 \} \}\).

则我们需要一种支持区间修改、求区间最值的数据结构,用线段树实现.

posted @ 2023-08-22 12:54  johnsmith0x3f  阅读(10)  评论(0)    收藏  举报