题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花。然后又如下两个操作。
1:A B 从第A个花瓶开始,往后依次插B朵花,直到不能插为止。如果一朵花都不能插入就输出“can.....”,否则输出第一个插花位置和最后一个插花位置。
2:A B 输出A B 之间有多少朵花 然后将这些花瓶清空。
当时比赛的时候始终找不到办法求出 最后一个插花位置。 也想过二分 但是想着怕效率太慢就没写。
其实最后想想也是 只有50000个操作 再乘以log N的二分 最多也就20W左右吧。
我是弱菜,自己写的程序效率巨慢。而且数组也开得多。
思路:
用lef 记录每个区间最左边可以放的花瓶,如果没有就是INF
用rig 记录每个区间最右边可以放的花瓶,如果没有就是-1
以上两个在更新的时候 lef选较小的 rig选较大的
cov表示区间全空 0 还是全满1 ,或者是不空不满 -1
然后emp表示区间空花瓶数。
主要的难点就是可以插花的时候怎么找到最后一个插花位置。
那么就用二分 找那个 emp == 所需要插花的数量 的最小右边的区间。
详见代码。
#include
#include
#include
#include
#include
#include