解题思路
设当前所有画了红线的位置为若干点,再加上绳子的两个端点 1,n。
如果把这些位置全部剪断,那么得到的每一段绳子的长度,就是这些点按从小到大排序后,相邻两点的差值。
因此,题目本质上是在动态维护:
- 插入一个切点 x
- 询问当前所有相邻切点间的最大间隔是否 ≥k
P4793.第2题-动态红线剪断查询
题目内容
小红有一根长度为 n−1 的绳子,她在绳子上均匀的画了 n 个点(包括端点),点的编号为 1∼n,这样绳子被均匀的分为 n−1 段。
她现在提出 Q 次询问,每次询问要求进行下述操作的其中一种:
- 操作一:在点 x (1<x<n) 上画一条红线。
- 操作二:若把当前画红线的地方全部剪断,询问是否存在长度大于等于 k 的绳子;
不考虑绳子的损耗且每次询问独立(即假设绳子剪断,但实际上并不真的剪断),请你回答小红的每次询问。
输入描述
第一行输入两个整数 n,Q (3≤n≤109; 1≤Q≤105) 代表绳子的长度、小红的操作询问次数。
接下来 Q 行,每行先输入一个整数 op (1≤op≤2) 表示操作询问的类型,随后:
- 当 op=1,在同一行输入一个整数 x (1<x<n) 表示在 x 处画一条红线;
- 当 op=2,在同一行输入一个整数 k (1≤k≤109) 查询若把当前的红线剪断,是否存在长度大于等于 k 的绳子线段。
输出描述
对于每个询问二,若把当前的红线剪断,会存在长度大于等于 k 的绳子,在一行上输出 YES;否则,直接输出 NO。
样例1
输入
8 7
2 7
1 4
2 4
2 5
1 6
2 3
2 4
输出
YES
YES
NO
YES
NO
说明
初始时绳子形象的表示为 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8:
- 对于第一次操作,由于此前没有画过红线,所以得到一根长度为 7 的绳子,符合询问;
- 对于第二次操作,在第四个点的位置画一条红线,得到
1 - 2 - 3 - [4] - 5 - 6 - 7 - 8;
- 对于第三次操作,切断后得到一根长度为 3 的绳子和一根长度为 4 的绳子,
1 - 2 - 3 - 4 和 4 - 5 - 6 - 7 - 8,符合询问;
- 对于第四次操作,同上,不符合询问;
- 对于第五次操作,在第六个点的位置画一条红线,得到
1 - 2 - 3 - [4] - 5 - [6] - 7 - 8;
- 对于第六次操作,切断后得到一根长度为 3 的绳子和两根长度为 2 的绳子,
1 - 2 - 3 - 4、4 - 5 - 6 和 6 - 7 - 8,符合询问。