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

  HDU2871.cpp

 

posted @ 2019-10-17 12:12  HHHyacinth  阅读(129)  评论(0编辑  收藏  举报