气死我了...这个毒瘤内存分配.....

优先队列 + 链表模拟,看起来搞一搞就好了却WA来WA去...

最后对拍手动找才发现错误:

erase的时候不要急急忙忙插入wait!要把同一时期的erase完再插入wait!

 #include <cstdio>
#include <queue>
typedef long long LL;
const LL N = ;
const LL INF = 1ll << ; struct Ask {
LL time, len, last;
Ask(LL t, LL l, LL s) {
time = t;
len = l;
last = s;
}
}; struct Out {
LL time, pos;
Out(LL t, LL p) {
time = t;
pos = p;
}
inline bool operator <(const Out &x) const {
return time > x.time;
}
}; struct ListNode {
LL pre, nex, l, r;
bool vis;
}li[N]; LL head = N - , tail = N - , top = ; LL n;
std::queue<Ask> Wait, Come;
std::priority_queue<Out> Erase; inline void init() {
li[head].nex = ;
li[].pre = head;
li[].nex = tail;
li[].l = ;
li[].r = n - ;
li[tail].pre = ;
return;
} inline LL getpos(LL k) {
LL p = li[head].nex;
while(p != tail) {
while(li[p].vis) {
p = li[p].nex;
}
if(p == tail) {
return ;
}
if(li[p].r - li[p].l + >= k) {
return p;
}
p = li[p].nex;
}
return ;
} inline LL insert(Ask x) {
LL p = getpos(x.len);
if(!p) {
return ;
}
if(li[p].r - li[p].l + == x.len) {
li[p].vis = ;
return p;
}
++top;
li[top].r = li[p].r;
li[top].l = li[p].l + x.len;
li[p].r = li[top].l - ;
li[p].vis = ;
li[top].nex = li[p].nex;
li[top].pre = p;
li[p].nex = top;
li[li[top].nex].pre = top;
return p;
} inline void erase(Out x) {
LL p = x.pos;
li[p].vis = ; /// b p c
LL b = li[p].pre, c = li[p].nex;
if((li[b].vis || b == head) && (li[c].vis || c == tail)) {
return;
}
if(li[b].vis || b == head) {
li[p].nex = li[c].nex;
li[li[c].nex].pre = p;
li[p].r = li[c].r;
return;
}
if(li[c].vis || c == tail) {
li[p].pre = li[b].pre;
li[li[b].pre].nex = p;
li[p].l = li[b].l;
return;
}
li[p].nex = li[c].nex;
li[p].pre = li[b].pre;
li[li[c].nex].pre = p;
li[li[b].pre].nex = p;
li[p].l = li[b].l;
li[p].r = li[c].r;
return;
} int main() {
LL t, len, last;
int c = , w = ;
scanf("%lld", &n);
init();
while() {
scanf("%lld%lld%lld", &t, &len, &last);
if(!t && !len && !last) {
break;
}
Come.push(Ask(t, len, last));
}
LL sum = , T = ;
while(!Wait.empty() || !Come.empty() || !Erase.empty()) {
LL tc = INF, te = INF;
if(!Come.empty()) {
tc = Come.front().time;
}
if(!Erase.empty()) {
te = Erase.top().time;
}
if(te <= tc) {
while(Erase.top().time == te) {
erase(Erase.top());
Erase.pop();
if(Erase.empty()) {
break;
}
}
T = te;
LL in = ;
while(!Wait.empty()) {
in = insert(Wait.front());
if(!in) {
break;
}
Erase.push(Out(te + Wait.front().last, in));
Wait.pop();
}
}
else {
LL in = insert(Come.front());
if(in) {
Erase.push(Out(tc + Come.front().last, in));
}
else {
Wait.push(Come.front());
sum++;
}
Come.pop();
}
} printf("%lld\n%lld", T, sum);
return ;
}

AC代码

poj1193 内存分配的更多相关文章

  1. 《深入理解Java虚拟机》内存分配策略

    上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...

  2. Java的内存分配

    java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...

  3. C语言内存分配方法。

    当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...

  4. JVM内存分配策略

    在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...

  5. Java的垃圾回收和内存分配策略

    本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...

  6. Buddy内存分配算法

    Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...

  7. 小白请教几个关于Java虚拟机内存分配策略的问题

    最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI C ...

  8. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  9. Linux内核笔记——内存管理之块内存分配

    内核版本:linux-2.6.11 伙伴系统 伙伴系统是linux用于满足对不同大小块物理内存分配和释放请求的解决方案. 内存管理区 linux将物理内存分成三个内存管理区,分别为ZONE_DMA Z ...

随机推荐

  1. Angular 自定义过滤器

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  2. CentOS7安装k8s

    借鉴博客:https://www.cnblogs.com/xkops/p/6169034.html 此博客里面有每个k8s配置文件的注释:https://blog.csdn.net/qq_359048 ...

  3. Mermaid js与流程图、甘特图..

    https://mermaidjs.github.io/gantt.html https://github.com/jdbranham/grafana-diagram 用 mermaid 画甘特图 h ...

  4. snv的使用

    1.搭建SVN服务器 (1)直接安装 (2)创建工号,分组,分配权限(图形化界面的直接操作,非图形界面的需要改配置文件conf文件夹下) (3)创建仓库,D:\Repositories\OA:cmd命 ...

  5. python3 自动识图

    一.安装依赖库 pip install pytesseract pip install pillow 二.安装识图引擎tesseract-ocr https://pan.baidu.com/s/1Qa ...

  6. loadrunner -vuser

    在每个负载生成器上,安装 remote agent dispatcher(process) 和 loadrunner agent 控制器指示remote agent dispatcher 在load ...

  7. vue-cli: preset预设

    preset:预设 vue create demo01 过程中,会保存预设,自动保存着 .vuerc 文件中 .vuerc 文件的位置:C:\Users\Administrator C:\Users\ ...

  8. js笔记2

    原型:prototype 和 __proto__ prototype 给他即将生成的对象继承下去的属性 prototype: 显式原型,每个function下都有prototype属性,该属性是一个对 ...

  9. JavaScript的 sourcemap 的理解

    当我们在使用vue-cli 开发项目完成后, 就要进行部署,执行npm run build 命令,你会发现它生成.js文件的同时,还会生成一个对应的.map 文件. 当时查了一下, .map 文件的主 ...

  10. Nginx 浏览器缓存

    L:97 一般都是 同时使用 浏览器与Nginx缓存