zoukankan      html  css  js  c++  java
  • 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>
    #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;
        else
            ret = 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;
            else
                l = 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
    ");
                } 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
    ", x);
                        } else
                            printf("Reject New
    ");
    
                    } 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
    ", list[x].first, list[x].second);
                            list.erase(list.begin() + x);
                        } else
                            printf("Reject Free
    ");
    
                    } else if (op[0] == 'G') {
                        if (k <= list.size()) {
                            printf("Get at %d
    ", list[k-1].first);
                        } else
                            printf("Reject Get
    ");
                    }
                }
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    Asp.Net MVC4入门指南(3):添加一个视图
    Asp.Net MVC4入门指南(2):添加一个控制器
    Asp.Net MVC4入门指南(1): 入门介绍
    .net平台借助第三方推送服务在推送Android,IOS消息(极光推送_V2版本)
    ASP.NET网站实现中英文转换(本地化资源)
    .net 内置对象之Session对象和Session的过期时间
    SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程
    Js键盘事件全面控制,回车按键事件,键盘对应按键码,按键事件兼容各个浏览器。
    C# WebBrowser控件详解
    html .net 网页,网站标题添图标
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4007017.html
Copyright © 2011-2022 走看看