HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)
•题意
有 n 个内存单元(编号从1开始);
给出 4 种操作:
(1)Reset :表示把所有的内存清空,然后输出 "Reset Now"。
(2)New x :表示申请一块长度为 x 的内存块(满足起始地址尽可能小);
如果找到,输出 "New at A",A表示该内存块的起点,找不到,输出 "Reject New"。
(3)Free x :表示把包含第 x 块单位内存的内存块清除;
如果 x 在某内存块中,输出 "Free from A toB",A和B分别表示该内存块的起点和终点,找不到,输出 "Reject Free"。
(4)"Get x",表示返回第 x 块内存块的起始内存单位编号;
如果找到,输出 "Get at A",A 表示第 x 块内存块的起始地址,找不到,输出 "Reject Get"。
•题解
类似于这道题【POJ3667 Hotel】,找连续的 x 个空内存单元,并满足起始地址尽可能小;
唯一不同的是此题需要记录找到的内存块的地址;
根据操作(3)(4)的要求,我们可以用 set 存储地址块;
对于 (3) 操作调用 set 中的 upper_bound() 函数判断是否有解以及解的位置;
对于 (4) 操作,在 set 中暴力查找即可;
•Code