HDU 2871"Memory Control"(线段树区间和并+set<pii >.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

原文地址:https://www.cnblogs.com/violet-acmer/p/11691263.html

时间: 2024-11-02 08:42:52

HDU 2871"Memory Control"(线段树区间和并+set<pii >.lower_bound())的相关文章

hdu 2871 Memory Control(线段树)

题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放所有空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内存块 Get x:查询第x个内存块,输出左地址 解题思路:一开始全用线段树去做,写的乱七八糟,其实只要用线段树维护可用内存.然后用户一个vector记录所有的内存块. #include <cstdio> #include <cstring> #include <vector>

HDU 2871 Memory Control (线段树,区间合并)

http://acm.hdu.edu.cn/showproblem.php?pid=2871 Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4418    Accepted Submission(s): 1056 Problem Description Memory units are numbered

HDU 2871 Memory Control(线段树)

HDU 2871 Memory Control 题目链接 题意:内存操作,和hotel那题差不多,多一个get操作 思路:线段树区间合并,其他都差不多,多一个get操作,这个用set去乱搞就过了- -,估计数据鶸吧,多这个操作感觉要用splay去搞了 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; const i

HDU 2871 Memory Control

一共4种操作 其中用线段树 区间合并,来维护连续空的长度,和找出那个位置.其他用vector维护即可 #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include <iostream> #include<vector> #define lson i<<1 #define rson i<<1|1 #define N

HDU 5316 Magician(线段树区间合并入门)

本文纯属原创,转载请注明出处谢谢.http://blog.csdn.net/zip_fan. 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5316 Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Fantasy magicians usually gain their ability

HDU 2871 Memory Control(线段树&#183;区间合并&#183;Vector)

题意  模拟内存申请  有n个内存单元  有以下4种操作 Reset  将n个内存单元全部清空 New x  申请一个长度为x的连续内存块  申请成功就输出左端 Free x  将x所在的内存块空间释放  释放成功输出释放的内存始末位置 Get x  输出第x个内存块的起始位置 Reset 和 New 都是基本的区间合并知识  比较简单  Free和Get需要知道内层块的位置  所以我们在New的时候要将申请的内存块的始末位置都存起来  两个内层块不会相交  这样就能通过二分找到需要的内层块了

hdu 2871 Memory Control(成段更新,区间合并)

这道题在网上搜了一下题解,别人说是比hdu hotel还要变态的一题. 既然是变态题,因为它综合了线段树的几乎所有操作. 这道题的题意是: 有如下几个操作: 1:首先是Reset操作,这个操作代表的是把所有的内存空间全部都清空. 2:New x:代表的是分配一个x个内存空间,如果有内存空间的话,则输出那个内存空间的最左边的那个端点.否则,则输出Reject New 3:Free x:代表的是释放含有x这个数的内存空间.如果这个内存空间已经被释放了,那么就输出Reject Free 4:Get x

HDU 5861 Road(线段树 区间修改 单点查询)

Road Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1132    Accepted Submission(s): 309 Problem Description There are n villages along a high way, and divided the high way into n-1 segments. E

HDU 5316——Magician——————【线段树区间合并区间最值】

Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1613    Accepted Submission(s): 470 Problem Description Fantasy magicians usually gain their ability through one of three usual methods: