HDU 2871 Memory Control
题意:内存操作,和hotel那题差不多,多一个get操作
思路:线段树区间合并,其他都差不多,多一个get操作,这个用set去乱搞就过了- -,估计数据鶸吧,多这个操作感觉要用splay去搞了
代码:
#include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; const int N = 50005; #define MP(a,b) make_pair(a,b) typedef pair<int, int> pii; int n, m; set<pii> g; set<pii>::iterator it; #define lson(x) ((x<<1)+1) #define rson(x) ((x<<1)+2) struct Node { int l, r, lsum, rsum, sum, lazy; int size() {return r - l + 1;} void gao(int v) { lazy = v; lsum = rsum = sum = v * size(); } } node[N * 4]; void pushdown(int x) { if (node[x].lazy != -1) { node[lson(x)].gao(node[x].lazy); node[rson(x)].gao(node[x].lazy); node[x].lazy = -1; } } void pushup(int x) { node[x].lsum = node[lson(x)].lsum; node[x].rsum = node[rson(x)].rsum; node[x].sum = max(node[lson(x)].sum, node[rson(x)].sum); if (node[lson(x)].lsum == node[lson(x)].size()) node[x].lsum += node[rson(x)].lsum; if (node[rson(x)].rsum == node[rson(x)].size()) node[x].rsum += node[lson(x)].rsum; node[x].sum = max(node[x].sum, node[lson(x)].rsum + node[rson(x)].lsum); } void build(int l, int r, int x = 0) { node[x].l = l; node[x].r = r; node[x].lazy = -1; if (l == r) { node[x].lsum = node[x].rsum = node[x].sum = 1; return; } int mid = (l + r) / 2; build(l, mid, lson(x)); build(mid + 1, r, rson(x)); pushup(x); } void add(int l, int r, int v, int x = 0) { if (node[x].l >= l && node[x].r <= r) { node[x].gao(v); return; } int mid = (node[x].l + node[x].r) / 2; pushdown(x); if (l <= mid) add(l, r, v, lson(x)); if (r > mid) add(l, r, v, rson(x)); pushup(x); } #define INF 0x3f3f3f3f int query(int v, int x = 0) { if (node[x].l == node[x].r) return node[x].l; int mid = (node[x].l + node[x].r) / 2; pushdown(x); int ans = INF; if (node[lson(x)].sum >= v) ans = query(v, lson(x)); else if (node[lson(x)].rsum + node[rson(x)].lsum >= v) ans = node[lson(x)].r - node[lson(x)].rsum + 1; else if (node[rson(x)].sum >= v) ans = query(v, rson(x)); pushup(x); return ans; } int main() { while (~scanf("%d%d", &n, &m)) { build(1, n); g.clear(); char op[15]; int x; while (m--) { scanf("%s", op); if (op[0] == 'R') { printf("Reset Now\n"); add(1, n, 1); g.clear(); continue; } scanf("%d", &x); if (op[0] == 'N') { int v = query(x); if (v != INF) { printf("New at %d\n", v); add(v, v + x - 1, 0); g.insert(MP(v, v + x - 1)); } else printf("Reject New\n"); } if (op[0] == 'G') { if (g.size() < x) printf("Reject Get\n"); else { it = g.begin(); for (int i = 0; i < x - 1; i++) it++; printf("Get at %d\n", it->first); } } if (op[0] == 'F') { it = g.upper_bound(MP(x, INF)); if (it == g.begin()) printf("Reject Free\n"); else { it--; if (it->second < x) printf("Reject Free\n"); else { printf("Free from %d to %d\n", it->first, it->second); add(it->first, it->second, 1); g.erase(it); } } } } printf("\n"); } return 0; }
时间: 2024-10-16 03:52:51