题目链接:hdu 2871 Memory Control

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

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn = 50005;
  7. #define lson(x) ((x)<<1)
  8. #define rson(x) (((x)<<1)|1)
  9. int lc[maxn << 2], rc[maxn << 2], set[maxn << 2];
  10. int L[maxn << 2], R[maxn << 2], S[maxn << 2];
  11. inline int length (int u) {
  12. return rc[u] - lc[u] + 1;
  13. }
  14. inline void maintain (int u, int v) {
  15. set[u] = v;
  16. L[u] = R[u] = S[u] = (v ? 0 : length(u));
  17. }
  18. inline void pushup (int u) {
  19. S[u] = max( max(S[lson(u)], S[rson(u)]), L[rson(u)] + R[lson(u)]);
  20. L[u] = L[lson(u)] + (L[lson(u)] == length(lson(u)) ? L[rson(u)] : 0);
  21. R[u] = R[rson(u)] + (R[rson(u)] == length(rson(u)) ? R[lson(u)] : 0);
  22. }
  23. inline void pushdown (int u) {
  24. if (set[u] != -1) {
  25. maintain(lson(u), set[u]);
  26. maintain(rson(u), set[u]);
  27. set[u] = -1;
  28. }
  29. }
  30. void build (int u, int l, int r) {
  31. lc[u] = l;
  32. rc[u] = r;
  33. set[u] = -1;
  34. if (l == r) {
  35. maintain(u, 0);
  36. return;
  37. }
  38. int mid = (l + r) / 2;
  39. build(lson(u), l, mid);
  40. build(rson(u), mid + 1, r);
  41. pushup(u);
  42. }
  43. void modify (int u, int l, int r, int v) {
  44. if (l <= lc[u] && rc[u] <= r) {
  45. maintain(u, v);
  46. return;
  47. }
  48. pushdown(u);
  49. int mid = (lc[u] + rc[u]) / 2;
  50. if (l <= mid)
  51. modify(lson(u), l, r, v);
  52. if (r > mid)
  53. modify(rson(u), l, r, v);
  54. pushup(u);
  55. }
  56. int query (int u, int len) {
  57. if (S[u] < len)
  58. return 0;
  59. if (lc[u] == rc[u])
  60. return lc[u];
  61. pushdown(u);
  62. int mid = (lc[u] + rc[u]) / 2, ret;
  63. if (S[lson(u)] >= len)
  64. ret = query(lson(u), len);
  65. else if (L[rson(u)] + R[lson(u)] >= len)
  66. ret = mid - R[lson(u)] + 1;
  67. else
  68. ret = query(rson(u), len);
  69. pushup(u);
  70. return ret;
  71. }
  72. typedef pair<int, int> pii;
  73. int N, M;
  74. vector<pii> list;
  75. int find (int k) {
  76. int l = 0, r = list.size() - 1;
  77. while (l <= r) {
  78. int mid = (l + r) / 2;
  79. if (list[mid].first > k)
  80. r = mid - 1;
  81. else
  82. l = mid + 1;
  83. }
  84. return l;
  85. }
  86. int main () {
  87. while (scanf("%d%d", &N, &M) == 2) {
  88. build (1, 1, N);
  89. list.clear();
  90. int k;
  91. char op[5];
  92. while (M--) {
  93. scanf("%s", op);
  94. if (op[0] == 'R') {
  95. modify(1, 1, N, 0);
  96. list.clear();
  97. printf("Reset Now\n");
  98. } else {
  99. scanf("%d", &k);
  100. if (op[0] == 'N') {
  101. int x = query(1, k);
  102. if (x) {
  103. modify(1, x, x + k - 1, 1);
  104. pii u = make_pair(x, x + k - 1);
  105. list.insert(list.begin() + find(x), u);
  106. printf("New at %d\n", x);
  107. } else
  108. printf("Reject New\n");
  109. } else if (op[0] == 'F') {
  110. int x = find(k) - 1;
  111. if (x != -1 && k <= list[x].second) {
  112. modify(1, list[x].first, list[x].second, 0);
  113. printf("Free from %d to %d\n", list[x].first, list[x].second);
  114. list.erase(list.begin() + x);
  115. } else
  116. printf("Reject Free\n");
  117. } else if (op[0] == 'G') {
  118. if (k <= list.size()) {
  119. printf("Get at %d\n", list[k-1].first);
  120. } else
  121. printf("Reject Get\n");
  122. }
  123. }
  124. }
  125. printf("\n");
  126. }
  127. return 0;
  128. }

hdu 2871 Memory Control(线段树)的更多相关文章

  1. hdu 2871 Memory Control(伸展树splay tree)

    hdu 2871 Memory Control 题意:就是对一个区间的四种操作,NEW x,占据最左边的连续的x个单元,Free x 把x单元所占的连续区间清空 , Get x 把第x次占据的区间输出 ...

  2. hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset  清空所有内存2.New x  分配一个大小为x的内存块返回,返 ...

  3. HDU 2871 Memory Control

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

  4. HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)

    传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...

  5. ●HDU 2871 Memory Control(Splay)

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

  6. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  7. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  8. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

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

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

随机推荐

  1. 条件变量(Condition Variable)详解

    条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A中包含两个线程t1和t2.t1需要在bool变量test_cond ...

  2. Linux下使用system()函数一定要谨慎

    转载自:http://my.oschina.net/renhc/blog/53580   linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对syste ...

  3. 使用windos电脑模拟搭建集群(三)实现全网监控

    这里我们采用小米监控 open-falcon  这是server端就是 192.168.5.200 这台主机, agent就是负责将数据提交到 server端       agent整个集群所有主机都 ...

  4. easyui常用

    清空列表选中项 //easyui datagrid 清空勾选 $('#List').datagrid('clearSelections'); 扩展修改查询方法 function QueryList() ...

  5. Js 利用正则表达式和replace函数获取string中所有被匹配到的文本

    js的replace函数除了替换文本以外还有获取所有被正则表达式匹配到的文本的功能.这里以一个简单的案例来作为演示. 利用正则查找出所有被两个花括号包裹的字符串: var str = '<div ...

  6. Gym - 101194F(后缀数组)

    Mr. Panda and Fantastic Beasts 题意 给出若干个字符串,找到一个最短的字典序最小的字符串且仅是第一个字符串的子串. 分析 对于这种多个字符串.重复的子串问题一般都要连接字 ...

  7. KMP CF126B Password

    Description Asterix,Obelix和他们的临时伙伴Suffix.Prefix已经最终找到了和谐寺.然而和谐寺大门紧闭,就连Obelix的运气也没好到能打开它. 不久他们发现了一个字符 ...

  8. [CP1804]组合数问题2

    题目大意: 给定两个数$n(n\le10^6)$和$k(k\le10^5)$,找到$k$个不同的满足$0\le b\le a\le n$的组合数$\binom a b$,求这$k$个组合数的最大值. ...

  9. nat的翻译类型(1)--静态nat

    目的:在1.1 1.2 1.3 三台内网的服务器访问外网的服务器(202.1.1.2)时,将内网ip转换为外网ip. 1.设置内网三台服务器的Ip ,网关,以及外网服务器的ip网关 分别为:192.1 ...

  10. Word中如何公式居中标号右对齐

    1.鼠标居中 2.插入一行三列表格 3.选中第一个表格,右键-表格属性-单元格-选项:然后回到单元格设置垂直居中,宽度为15%,同理第三个单元格,不过中间单元格也要设置,宽度为70%,这个word没有 ...