本节课主题:用线段树维护“第一个满足的下标”
引入
给你 h × n h\times n h×n 的广告牌,有 m m m 张广告,每次要贴一个大小为 1 × k 1 \times k 1×k 的广告,广告会优先贴到最上方能贴得下的位置,如: 3 × 5 3\times 5 3×5 的广告牌,要贴上三张 1 × 2 1\times 2 1×2 的广告,则第一张和第二张会贴在第一行,第三张广告由于贴不下第一行,只能贴在第二行。给定广告牌和每张广告大小,问每一张广告将被贴在哪一行。 1 ≤ h ≤ 1 0 18 1 \leq h \leq 10^{18} 1≤h≤1018, 1 ≤ n , m , k ≤ 1 0 5 1 \leq n,m,k \leq 10^5 1≤n,m,k≤105。
简单实践:旅游团
【题目描述】
暑假期间,景区的人气非常火爆,为了不影响交通,景区提前在门口修筑了地下通道。
已知,景区在马路左边修建了 n n n 个地下通道的入口,在右边修建了 n n n 个出口,直通售票处,左右两边分别自上而下标记为 1 ∼ n 1∼n 1∼n。行人可以通过地下通道从任意入口进入,并且从任意出口出去。公园开园时,第 i i i 个售票处有 w i w_i wi 张门票。
景区开园了,依次来了 q q q 个旅游团,第 i i i 个旅游团中有 a i a_i ai 个人,他们会从左边第 b i b_i bi 个通道进入地下通道,他们需要选择一个出口,需要满足选择的出口连通的售票处剩余的票数 ≥ a i \geq a_i ≥ai,如果有多个出口满足条件,则选择距离 b i b_i bi 最近的出口(假设从 k k k 出去,则距离为: ∣ b i − k ∣ ∣b_i−k∣ ∣bi−k∣),如果还有多个出口满足条件,则选择编号最小的出口。这个旅游团通过售票处后,售票处的门票数量要减少 a i a_i ai。
请你计算出每个旅游团从哪一个出口出去,如果没有符合要求的出口,则输出 − 1 −1 −1,并忽略这个旅游团。
输入格式
第一行输入两个正整数 n , q n,q n,q 表示地下通道左右两边出口、入口的数量和旅游团的数量。
接下来一行 n n n 个数,第 i i i 个数表示第 i i i 个售票处门票的数量。
接下来 q q q 行,每行两个整数 a i , b i a_i,b_i ai,bi,表示第 i i i 个旅游团的人数为 a i a_i ai,从第 b i b_i bi 个入口进入。
输出格式
输出共 q q q 行,第 i i i 行,表示第 i i i 个旅游团要从哪个出口出去,如果没有满足条件的出口,则输出 − 1 −1 −1。
数据范围
对于 100 % 100\% 100% 的数据, 1 ≤ n , q ≤ 5 × 1 0 5 , 0 ≤ a i , w i ≤ 1 0 9 , 0 ≤ b i ≤ n 1≤n,q≤5×10^5,0≤a_i,w_i≤10^9,0≤b_i≤n 1≤n,q≤5×105,0≤ai,wi≤109,0≤bi≤n。
样例输入
5 5
9 8 6 10 5
4 5
2 5
8 1
9 3
3 1
样例输出
5
4
1
-1
2
样例解释
最初每个售票处门票数量:9 8 6 10 5
;
- 第一个旅游团到来,
a
1
=
4
,
b
1
=
5
a_1=4,b_1=5
a1=4,b1=5,会前往第
5
5
5 个售票处,每个售票处剩余门票:
9 8 6 10 1
; - 第二个旅游团到来,
a
2
=
2
,
b
2
=
5
a_2=2,b_2=5
a2=2,b2=5,会前往第
4
4
4 个售票处,每个售票处剩余门票:
9 8 6 8 1
; - 第三个旅游团到来,
a
3
=
8
,
b
3
=
1
a_3=8,b_3=1
a3=8,b3=1,会前往第
1
1
1 个售票处,每个售票处剩余门票:
1 8 6 8 1
; - 第四个旅游团到来,
a
4
=
9
,
b
4
=
3
a_4=9,b_4=3
a4=9,b4=3,此时没有合法的售票处,每个售票处剩余门票:
1 8 6 8 1
; - 第五个旅游团到来,
a
5
=
3
,
b
5
=
1
a_5=3,b_5=1
a5=3,b5=1,会前往第
2
2
2 个售票处,每个售票处剩余门票:
1 5 6 8 1
。
灵活运用:Quiet and Falling
【题目描述】
云浅在「镜之古寺」中发现了一个长为 n n n 的序列 a a a。这里下标从 1 1 1 开始。
在接下来的 q q q 个时刻,每个时刻都会发生以下两种事件之一:
1 p
:「镜中世界」变幻无穷,序列 a 也发生了变化: a p a_p ap 与 a p + 1 a_p+1 ap+1 被互相交换了。保证 1 ≤ p < n 1\leq p<n 1≤p<n。2 x
:「镜之古寺」发出了询问:你需要找到一个区间 [ l , r ] [l,r] [l,r],满足其长度 r r r − − − l l l + + + 1 1 1 ≥ x \geq x ≥x,且 m e x ( a l , a l + 1 , ⋯ , a r ) mex(a_l,a_l+1,⋯,a_r) mex(al,al+1,⋯,ar) 尽可能小。你只需要输出这个最小的 m e x mex mex 值即可。
其中, m e x ( x 1 , x 2 , ⋯ , x k ) mex(x_1,x_2,⋯,x_k) mex(x1,x2,⋯,xk) 表示最小的没有在 x 1 , x 2 , ⋯ , x k x_1,x_2,⋯,x_k x1,x2,⋯,xk 中出现过的非负整数。例如, m e x ( 0 , 1 , 3 ) = 2 mex(0,1,3)=2 mex(0,1,3)=2 , m e x ( 1 , 2 ) = 0 mex(1,2)=0 mex(1,2)=0。
输入格式
第一行两个正整数 n , q n,q n,q。
第二行 n n n 个非负整数 a 1 , a 2 , ⋯ , a n a_1,a_2,⋯,a_n a1,a2,⋯,an。
接下来 q q q 行,每行两个正整数,表示一次变化或询问。
输出格式
对于每次询问,输出一行一个非负整数表示答案。
数据范围
对于 100 % 100\% 100% 的数据, 1 ≤ n , q ≤ 5 × 1 0 5 1≤n,q≤5×10^5 1≤n,q≤5×105, 0 ≤ a i ≤ n 0≤a_i≤n 0≤ai≤n。
样例输入
7 6
0 1 0 2 1 0 3
2 2
2 3
2 4
1 4
2 3
2 4
样例输出
0
2
3
1
2
样例解释
对于第一次询问,取区间 [ 4 , 5 ] [4,5] [4,5] 即可。
对于第二次询问,取区间 [ 1 , 3 ] [1,3] [1,3] 即可。
对于第三次询问,取区间 [ 1 , 4 ] [1,4] [1,4] 即可。
接下来序列出现了变化,变为 a = ( 0 , 1 , 0 , 1 , 2 , 0 , 3 ) a=(0,1,0,1,2,0,3) a=(0,1,0,1,2,0,3)。
对于第四次询问,取区间 [ 5 , 7 ] [5,7] [5,7] 即可。
对于第五次询问,取区间 [ 1 , 4 ] [1,4] [1,4] 即可。
真题再现:廊桥分配
【题目描述】
当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位。乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折。然而,因为廊桥的数量有限,所以这样的愿望不总是能实现。
机场分为国内区和国际区,国内航班飞机只能停靠在国内区,国际航班飞机只能停靠在国际区。一部分廊桥属于国内区,其余的廊桥属于国际区。
L 市新建了一座机场,一共有 n n n 个廊桥。该机场决定,廊桥的使用遵循“先到先得”的原则,即每架飞机抵达后,如果相应的区(国内/国际)还有空闲的廊桥,就停靠在廊桥,否则停靠在远机位(假设远机位的数量充足)。该机场只有一条跑道,因此不存在两架飞机同时抵达的情况。
现给定未来一段时间飞机的抵达、离开时刻,请你负责将 n n n 个廊桥分配给国内区和国际区,使停靠廊桥的飞机数量最多。
输入格式
输入的第一行,包含三个正整数 n , m 1 , m 2 n, m_1, m_2 n,m1,m2,分别表示廊桥的个数、国内航班飞机的数量、国际航班飞机的数量。
接下来 m 1 m_1 m1 行,是国内航班的信息,第 i i i 行包含两个正整数 a 1 , i , b 1 , i a_{1, i}, b_{1, i} a1,i,b1,i,分别表示一架国内航班飞机的抵达、离开时刻。
接下来 m 2 m_2 m2 行,是国际航班的信息,第 i i i 行包含两个正整数 a 2 , i , b 2 , i a_{2, i}, b_{2, i} a2,i,b2,i,分别表示一架国际航班飞机的抵达、离开时刻。
每行的多个整数由空格分隔。
输出格式
输出一个正整数,表示能够停靠廊桥的飞机数量的最大值。
样例输入 #1
3 5 4
1 5
3 8
6 10
9 14
13 18
2 11
4 15
7 17
12 16
样例输出 #1
7
样例输入 #2
2 4 6
20 30
40 50
21 22
41 42
1 19
2 18
3 4
5 6
7 8
9 10
样例输出 #2
4
提示
【样例解释 #1】
在图中,我们用抵达、离开时刻的数对来代表一架飞机,如 ( 1 , 5 ) (1, 5) (1,5) 表示时刻 1 1 1 抵达、时刻 5 5 5 离开的飞机;用 √ \surd √ 表示该飞机停靠在廊桥,用 × \times × 表示该飞机停靠在远机位。
我们以表格中阴影部分的计算方式为例,说明该表的含义。在这一部分中,国际区有 2 2 2 个廊桥, 4 4 4 架国际航班飞机依如下次序抵达:
- 首先 ( 2 , 11 ) (2, 11) (2,11) 在时刻 2 2 2 抵达,停靠在廊桥。
- 然后 ( 4 , 15 ) (4, 15) (4,15) 在时刻 4 4 4 抵达,停靠在另一个廊桥。
- 接着 ( 7 , 17 ) (7, 17) (7,17) 在时刻 7 7 7 抵达,这时前 2 2 2 架飞机都还没离开、都还占用着廊桥,而国际区只有 2 2 2 个廊桥,所以只能停靠远机位。
- 最后 ( 12 , 16 ) (12, 16) (12,16) 在时刻 12 12 12 抵达,这时 ( 2 , 11 ) (2, 11) (2,11) 这架飞机已经离开,所以有 1 1 1 个空闲的廊桥,该飞机可以停靠在廊桥。
根据表格中的计算结果,当国内区分配 2 2 2 个廊桥、国际区分配 1 1 1 个廊桥时,停靠廊桥的飞机数量最多,一共 7 7 7 架。
【样例解释 #2】
当国内区分配 2 2 2 个廊桥、国际区分配 0 0 0 个廊桥时,停靠廊桥的飞机数量最多,一共 4 4 4 架,即所有的国内航班飞机都能停靠在廊桥。
需要注意的是,本题中廊桥的使用遵循“先到先得”的原则,如果国际区只有 1 1 1 个廊桥,那么将被飞机 ( 1 , 19 ) (1, 19) (1,19) 占用,而不会被 ( 3 , 4 ) (3, 4) (3,4)、 ( 5 , 6 ) (5, 6) (5,6)、 ( 7 , 8 ) (7, 8) (7,8)、 ( 9 , 10 ) (9, 10) (9,10) 这 4 4 4 架飞机先后使用。
【数据范围】
对于
20
%
20 \%
20% 的数据,
n
≤
100
n \le 100
n≤100,
m
1
+
m
2
≤
100
m_1 + m_2 \le 100
m1+m2≤100。
对于
40
%
40 \%
40% 的数据,
n
≤
5000
n \le 5000
n≤5000,
m
1
+
m
2
≤
5000
m_1 + m_2 \le 5000
m1+m2≤5000。
对于
100
%
100 \%
100% 的数据,
1
≤
n
≤
10
5
1 \le n \le {10}^5
1≤n≤105,
m
1
,
m
2
≥
1
m_1, m_2 \ge 1
m1,m2≥1,
m
1
+
m
2
≤
10
5
m_1 + m_2 \le {10}^5
m1+m2≤105,所有
a
1
,
i
,
b
1
,
i
,
a
2
,
i
,
b
2
,
i
a_{1, i}, b_{1, i}, a_{2, i}, b_{2, i}
a1,i,b1,i,a2,i,b2,i 为数值不超过
10
8
{10}^8
108 的互不相同的正整数,且保证对于每个
i
∈
[
1
,
m
1
]
i \in [1, m_1]
i∈[1,m1],都有
a
1
,
i
<
b
1
,
i
a_{1, i} < b_{1, i}
a1,i<b1,i,以及对于每个
i
∈
[
1
,
m
2
]
i \in [1, m_2]
i∈[1,m2],都有
a
2
,
i
<
b
2
,
i
a_{2, i} < b_{2, i}
a2,i<b2,i。
总结
这些题目都需要转化成“第一个满足的下标”一类问题,单独求解只需要利用线段树的性质,二分地找到答案;复杂题目中会把它融入到其中的一个步骤里,要学会分析,把题意抽象出一个模型,再运用所学求解。