众所周知,魔法队的大家都是用传送门赶路的。
但是传送门偶尔也可能成为路上的阻碍。
在一条笔直的长为 n 米的道路上,有 m 个关闭的传送门。
CReatiQ 可以选择是否打开每扇传送门。
当有人走到传送门处时,他会被传送到道路的北端,之后这扇传送门将被关闭。
现在 Lacrymabre 以 1 米每秒的速度从道路的最北端走到道路的最南端吃饭。
CReatiQ 打算捉弄一下他!
CReatiQ 将会给出 q 次询问,每次询问至少打开多少扇传送门,才能使得 Lacrymabre 通过道路的所需时间大于 t_i。
因为重复运行对传送门会产生损耗,所以 CReatiQ 不会重复打开某扇传送门。
简单的二分 需要 反复手写 写出 腱鞘炎?(主播又在咬打火机了)
介绍:lower_bound!
lower_bound(begin,end,x);
lower_bound 可以在一个单调递增的数组中进行二分查找,它返回指向第一个 大于等于 x 的元素的位置的迭代器。若不存在,则返回尾迭代器。
若该数组不是单调递增的,可以先使用一次 sort 使得数组递增。
对一个 int 类型 1-index 一维数组的使用例:
int a[10001],x;
//...
sort(a+1,a+n+1); // 如果原本不递增,就需要进行 sort 使其获得可以 lower_bound 的性质。
int *it=lower_bound(a+1,a+n+1,x); // 返回第一个大于等于 x 的元素的位置的迭代器
如果需要的是第一个大于等于 x 的元素的位置下标:
int index=lower_bound(a+1,a+n+1,x)-a-1; // 后面减的是 begin
如果需要的是第一个大于等于 x 的元素的值:
int value=*lower_bound(a+1,a+n+1,x);
// !!!注意,当检索对象不一定存在时,可能需要先 check 一下返回的是否是 end,防止越界
可以类似得到:
0-index 下的写法:
int *it=lower_bound(a,a+n,x);
int index=lower_bound(a,a+n,x)-a;
int value=*lower_bound(a,a+n,x);
//value=*it;
//value=a[index];
0-index vector 下的写法:
sort(a.begin(),a.end());
vector<int>::iterator it=lower_bound(a.begin(),a.end(),x);
int index=lower_bound(a.begin(),a.end(),x)-a.begin();
int value=*lower_bound(a.begin(),a.end(),x); // 同理,注意 check lower_bound()=a.end() 的情况。
upper_bound 返回指向第一个 大于 x 的元素的位置的迭代器。若不存在,则返回尾迭代器。用法和 lower_bound 一样,可以多多自行尝试探索一下 qwq 。
输入
第一行三个正整数 n,m,q (1 \leq n \leq 10^9,1 \leq m \leq 2 \times 10^5,1 \leq q \leq 2 \times 10^5),分别表示道路的长度、传送门的数量与询问的数量。
第二行 m 个非负整数 d_i (0 \leq d_i \leq n),表示每个传送门到道路北端的距离。
随后 q 行每行一个非负整数 t_i (0 \leq t_i \leq 10^{18}),表示询问的所需时间。
输出
输出共 q 行,每行一个整数代表询问的答案,若无解则输出 -1 。
样例
| 标准输入 复制文本 |
10 7 6 1 9 1 9 8 1 0 10 16 36 37 13 36 |
| 标准输出 复制文本 |
1 1 4 5 1 4 |
提示
虽然有 lower_bound 的教学,但由于本题没有强制在线,不一定要使用二分通过。