250708 模拟赛
P9910 [COCI 2023/2024 #2] Dizalo
\(n\) 个人坐电梯,第 \(i\) 个人在第 \(a_i\) 层下电梯,\(a_{1\sim n}\) 构成一个排列。
电梯是长条形的,所以 \(n\) 个人初始时按编号顺序在电梯里列成一列,电梯会从下往上依次经过第 \(1\sim n\) 层。
当一个人要下电梯时,所有在他前面的人也必须暂时下电梯,然后可以以任意顺序返回电梯。在他后面的人不需要也不会下电梯。
如果每次临时下电梯的人总是以最优策略来决定返回电梯的顺序,请你求出所有人下电梯的总次数最少是多少。
给定 \(q\) 次操作,每次给定 \(x_i\) 表示移除编号为 \(x_i\) 的人,你需要在第一次操作前以及每次操作之后求出答案。
\(0\le q<n\le 10^5\)
考虑电梯序列 \(a_i\) 的后缀最小值序列,不难发现只有它们会对答案产生贡献,因此称它们为关键点。每个后缀最小值位置 \(i\) 产生的贡献为 \(cnt(j<i\wedge a[j]>a[i])\)。因此我们用 set
维护后缀最小值序列,然后考虑每次插入后的边际收益,可以用 cdq 或树套树解决。时间复杂度 \(O(n\log^2 n)\),足以通过。
实际上我们有 \(O(n\log n)\) 的做法。注意到由于关键点的右侧不存在更小的 \(a[j]\),因此 \(cnt(j<i\wedge a[j]>a[i])=cnt(a[j]>a[i])-cnt(j>i)\)。用四个 BIT
即可简单做到 \(O(n\log n)\)。
注意,在两种方法中,一个关键点 \(i\) 的加入只会统计到时间在它前面的数字贡献;因此每当我们加入一个非关键点,再查询一下其右下方有多少个关键点,也作为当前时刻的边际贡献。因此法一中 cdq 需要跑两遍,法二中维护两个信息需要四个 BIT
。
二维偏序的特殊情况
对于简单二位数点,如果能保证每个查询操作 \((x,y)\) 的一个 \(1/4\) 平面内固定没有点,那么二维偏序可以转化为一维偏序。
cdq 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
|
BIT
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
|
P9911 [COCI 2023/2024 #2] Kuglice
一个双端队列里面有 \(n\) 个球,每个球有一个颜色。\(A\) 和 \(B\) 玩一个游戏:
\(A\) 先手,两个人轮流操作,每次从队列的最左端或者最右端拿出一个球,如果这种颜色的球是第一次被拿出,拿出它的人获得 \(1\) 分。所有球都拿完后游戏结束。
假设 \(A\) 和 \(B\) 都以最优策略操作,请求出最终得分是多少。
\(n\le 3000\)
不难发现每种颜色只有在第一次出现和最后一次出现时可能会产生贡献。由于局面始终是一个连续段,因此考虑区间 dp,设 \(f_{i,j}\) 表示区间 \([i,j]\),先手比后手多得多少分。考虑转移,在 \([i,j]\) 区间中,先手只有两种不同的选择:拿走 \(i\) 或拿走 \(j\);而他会选择更优的一种进行操作。因此这样从 \(f_{i+1,j}\) 和 \(f_{i,j-1}\) 转移即可。