题目链接:hdu 2871 Memory Control

题目大意:模拟一个内存分配机制。

  • Reset:重置,释放全部空间
  • New x:申请内存为x的空间,输出左地址
  • Free x:释放地址x所在的内存块
  • Get x:查询第x个内存块,输出左地址

解题思路:一開始全用线段树去做,写的乱七八糟,事实上仅仅要用线段树维护可用内存。然后用户一个vector记录全部的内存块。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>using namespace std;
const int maxn = 50005;#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << 2], rc[maxn << 2], set[maxn << 2];
int L[maxn << 2], R[maxn << 2], S[maxn << 2];inline int length (int u) {return rc[u] - lc[u] + 1;
}inline void maintain (int u, int v) {set[u] = v;L[u] = R[u] = S[u] = (v ? 0 : length(u));
}inline void pushup (int u) {S[u] = max( max(S[lson(u)], S[rson(u)]), L[rson(u)] + R[lson(u)]);L[u] = L[lson(u)] + (L[lson(u)] == length(lson(u)) ? L[rson(u)] : 0);R[u] = R[rson(u)] + (R[rson(u)] == length(rson(u)) ? R[lson(u)] : 0);
}inline void pushdown (int u) {if (set[u] != -1) {maintain(lson(u), set[u]);maintain(rson(u), set[u]);set[u] = -1;}
}void build (int u, int l, int r) {lc[u] = l;rc[u] = r;set[u] = -1;if (l == r) {maintain(u, 0);return;}int mid = (l + r) / 2;build(lson(u), l, mid);build(rson(u), mid + 1, r);pushup(u);
}void modify (int u, int l, int r, int v) {if (l <= lc[u] && rc[u] <= r) {maintain(u, v);return;}pushdown(u);int mid = (lc[u] + rc[u]) / 2;if (l <= mid)modify(lson(u), l, r, v);if (r > mid)modify(rson(u), l, r, v);pushup(u);
}int query (int u, int len) {if (S[u] < len)return 0;if (lc[u] == rc[u])return lc[u];pushdown(u);int mid = (lc[u] + rc[u]) / 2, ret;if (S[lson(u)] >= len)ret = query(lson(u), len);else if (L[rson(u)] + R[lson(u)] >= len)ret = mid - R[lson(u)] + 1;elseret = query(rson(u), len);pushup(u);return ret;
}typedef pair<int, int> pii;
int N, M;
vector<pii> list;int find (int k) {int l = 0, r = list.size() - 1;while (l <= r) {int mid = (l + r) / 2;if (list[mid].first > k)r = mid - 1;elsel = mid + 1;}return l;
}int main () {while (scanf("%d%d", &N, &M) == 2) {build (1, 1, N);list.clear();int k;char op[5];while (M--) {scanf("%s", op);if (op[0] == 'R') {modify(1, 1, N, 0);list.clear();printf("Reset Now\n");} else {scanf("%d", &k);if (op[0] == 'N') {int x = query(1, k);if (x) {modify(1, x, x + k - 1, 1);pii u = make_pair(x, x + k - 1);list.insert(list.begin() + find(x), u);printf("New at %d\n", x);} elseprintf("Reject New\n");} else if (op[0] == 'F') {int x = find(k) - 1;if (x != -1 && k <= list[x].second) {modify(1, list[x].first, list[x].second, 0);printf("Free from %d to %d\n", list[x].first, list[x].second);list.erase(list.begin() + x);} elseprintf("Reject Free\n");} else if (op[0] == 'G') {if (k <= list.size()) {printf("Get at %d\n", list[k-1].first);} elseprintf("Reject Get\n");}}}printf("\n");}return 0;
}

hdu 2871 Memory Control(线段树)相关推荐

  1. HDU - 2871 Memory Control(线段树+区间合并)好题!

    题目链接:点击查看 题目大意:给定n个内存和m个操作,分别是: New x:从内存编号1开始向右查找,分配一个长度为x的空间,若找到输出区间的首地址,否则输出Reject New: Free x:释放 ...

  2. ●HDU 2871 Memory Control(Splay)

    ●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点 ...

  3. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

  4. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  5. HDU - I Hate It(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Li ...

  6. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

    HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...

  7. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  8. HDU 5454 Excited Database 线段树的维护

    传送门:HDU5454 Excited Database Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K ...

  9. HDU 4262 Juggler (模拟+线段树优化)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove http://acm.hdu.e ...

最新文章

  1. orcale 日期转字符串 去掉0_C# 基础知识系列- 13 常见类库介绍(二)日期时间类...
  2. 设计模式(一)————策略模式(张三的故事??)
  3. JVM年轻代参数:-Xmn、-XX:NewSize、-XX:MaxNewSize
  4. BZOJ 4066 简单题 ——KD-Tree套替罪羊树
  5. 实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!
  6. (21)css3盒模型box-sizing属性
  7. 滴滴披露女司机数据:80后女性过半 24%全年零违章
  8. 信用卡-可恶的招商银行,可恶的循环利息
  9. 通过OKhttp3 访问 https地址
  10. 银行家算法的数组方式实现
  11. android Activity生命周期总结
  12. 尚硅谷 谷粒学院 毕业设计 在线教育 部署文档
  13. [渝粤教育] 江苏农牧科技职业学院 兽医文化 参考 资料
  14. SecoClient 百度云安装包 亲测有效
  15. Word控件Spire.Doc 【页面设置】教程(1):在C#/VB.NET:在 Word 文档中插入分页符
  16. 我们为什么不画高保真原型图
  17. 权限漏洞:水平权限漏洞、垂直权限漏洞
  18. docker mysql 启动命令_Mac 下使用 Docker mysql 运行的容器如果挂载了/var/lib/mysql 不能启动容器...
  19. 楼天城楼教主的acm心路历程 ---- 抄自网上
  20. 罗杰斯:不看好房地产股票 最佳投资是大宗商品

热门文章

  1. 井下三专两闭锁的内容_局部通风机三专两闭锁具体规定
  2. java 矩阵题目_一些数学分析不错的题目
  3. python怎么用matplotlib画,用matplotlib在python中绘制OHLC图
  4. PHP页面运行一半,在PHP中仅缓存页面的一部分
  5. python文件实时同步_python文件自动同步备份v1.2【运维必备】2020/12/31
  6. em oracle 安装,oracle-EM安装
  7. 字节跳动 java面经_字节跳动Java面经(已offer)
  8. 台式计算机由哪些硬件组成,台式电脑硬件是由哪些组成的 - 卡饭网
  9. (11) ejb学习: Jpa事务管理类型 container 和 bean
  10. spring的DI/IOC机制