用线段树维护“第一个满足的下标”

本节课主题:用线段树维护“第一个满足的下标”

引入

给你 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} 1h1018 1 ≤ n , m , k ≤ 1 0 5 1 \leq n,m,k \leq 10^5 1n,m,k105

简单实践:旅游团

【题目描述】

暑假期间,景区的人气非常火爆,为了不影响交通,景区提前在门口修筑了地下通道。

已知,景区在马路左边修建了 n n n 个地下通道的入口,在右边修建了 n n n 个出口,直通售票处,左右两边分别自上而下标记为 1 ∼ n 1∼n 1n。行人可以通过地下通道从任意入口进入,并且从任意出口出去。公园开园时,第 i i i 个售票处有 w i w_i wi​ 张门票。

image.png

景区开园了,依次来了 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∣ bik),如果还有多个出口满足条件,则选择编号最小的出口。这个旅游团通过售票处后,售票处的门票数量要减少 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 1n,q5×105,0ai,wi109,0bin

样例输入
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 1p<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 1n,q5×105 0 ≤ a i ​ ≤ n 0≤a_i​≤n 0ain

样例输入
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 架国际航班飞机依如下次序抵达:

  1. 首先 ( 2 , 11 ) (2, 11) (2,11) 在时刻 2 2 2 抵达,停靠在廊桥。
  2. 然后 ( 4 , 15 ) (4, 15) (4,15) 在时刻 4 4 4 抵达,停靠在另一个廊桥。
  3. 接着 ( 7 , 17 ) (7, 17) (7,17) 在时刻 7 7 7 抵达,这时前 2 2 2 架飞机都还没离开、都还占用着廊桥,而国际区只有 2 2 2 个廊桥,所以只能停靠远机位。
  4. 最后 ( 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 n100 m 1 + m 2 ≤ 100 m_1 + m_2 \le 100 m1+m2100
对于 40 % 40 \% 40% 的数据, n ≤ 5000 n \le 5000 n5000 m 1 + m 2 ≤ 5000 m_1 + m_2 \le 5000 m1+m25000
对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 10 5 1 \le n \le {10}^5 1n105 m 1 , m 2 ≥ 1 m_1, m_2 \ge 1 m1,m21 m 1 + m 2 ≤ 10 5 m_1 + m_2 \le {10}^5 m1+m2105,所有 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

总结

这些题目都需要转化成“第一个满足的下标”一类问题,单独求解只需要利用线段树的性质,二分地找到答案;复杂题目中会把它融入到其中的一个步骤里,要学会分析,把题意抽象出一个模型,再运用所学求解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值