题目描述

输入

输出

输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位数。

样例输入

2 3

1 4

1 4

2 2 1

2 1 1

1 1 1

样例输出

2

3

1

数据范围

对于30%的数据,有1<=n,m<=1000

对于100%的数据,有1<=n,m<=100000

样例解释

解法

显然存在一种排列顺序,使得代价最小。

考虑这个排列的方式:易得b[i]<=b[j]时,代价最小。

感性证明:

假设当前所需代价为x,初始为0。

把所有代价小于等于x的程序立即完成,然后获得可以获得的内存。

直到没有完成的程序后,立即分配一单位的内存。

这样贪心可以保证正确性。


考虑合并两个程序为一个等价的程序。

(a1,b1)+(a2,b2)=(a1+a2,max(b1,b2−a1))。

显然把所有程序合并起来就是答案。

此外一个重要性质是,合并操作满足结合律。

这样就可以利用线段树来处理程序的合并。

离线处理即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
#define ln(x,y) ll(log(x)/log(y))
using namespace std;
const char* fin="ex3571.in";
const char* fout="ex3571.out";
const ll inf=0x7fffffff;
const ll maxn=100007*2,maxt=maxn*4;
ll n,m,i,j,k,l,rank[maxn],b[maxn],d[maxn];
struct prog{
ll get,need,id;
void operator=(const prog &b){
get=b.get;
need=b.need;
id=b.id;
}
prog(){
get=need=id=0;
}
}a[maxn],c[maxt];
prog merge(prog a,prog b){
prog c;
c.need=max(a.need,b.need-a.get);
c.get=a.get+b.get;
return c;
}
bool cmp(prog a,prog b){
return a.need<b.need;
}
void change(ll l,ll r,ll t,ll v,const prog &v1){
ll mid=(l+r)/2;
if (l==r){
c[t]=v1;
return ;
}
if (v<=mid) change(l,mid,t*2,v,v1);
else change(mid+1,r,t*2+1,v,v1);
c[t]=merge(c[t*2],c[t*2+1]);
}
int main(){
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++){
scanf("%d%d",&a[i].get,&a[i].need);
a[i].id=i;
}
for (i=n+1;i<=n+m;i++){
scanf("%d%d%d",&b[i],&k,&l);
a[i].need=l;
a[i].get=k;
a[i].id=i;
}
sort(a+1,a+n+m+1,cmp);
for (i=1;i<=n+m;i++) rank[a[i].id]=i;
for (i=1;i<=n;i++) change(1,n+m,1,rank[i],a[rank[i]]),d[i]=rank[i];
for (i=n+1;i<=n+m;i++){
change(1,n+m,1,d[b[i]],c[0]);
change(1,n+m,1,rank[i],a[rank[i]]);
d[b[i]]=rank[i];
printf("%lld\n",c[1].need);
}
return 0;
}

启发

对于这类不同排列不同答案的问题。

可以考虑合并元素;

如果元素满足结合律,那么就可以使用线段树进行合并。

【时光回溯】【JZOJ3571】【GDKOI2014】内存分配的更多相关文章

  1. 【GDKOI2014】JZOJ2020年8月13日提高组T4 内存分配

    [GDKOI2014]JZOJ2020年8月13日提高组T4 内存分配 题目 Description Input Output 输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位 ...

  2. c++内存分配

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

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

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

  4. Java的内存分配

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

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

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

  6. JVM内存分配策略

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

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

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

  8. Buddy内存分配算法

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

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

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

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

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

随机推荐

  1. VS2005连接MySQL C API

    1.在属性添加:附加目录,附加依赖库,附加库目录: 2.在stdafx.h中加入: #include <winsock.h> #include "mysql.h" 3. ...

  2. npm 安装删除模块

    npm安装模块 [npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [npm install -g xxx]利用npm安装全局模块xxx: 本地安装时将模块写入pac ...

  3. 安装mysql-workbench

    sudo apt-get install mysql-workbench

  4. 安装ubuntn16.04重启后出现grub secure界面

    参考:http://jingyan.baidu.com/article/c85b7a640cd7d6003bac95f8.html 安装ubuntn重启后出现grub secure界面的原因是在安装过 ...

  5. git bash 常用操作文件命令行

    1, cd : change directory的简写,改变目录的意思,就是切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通配 ...

  6. Linux安装Desktop 和 vncserver

    sudo su - #使用 root 账户 yum grouplist #查看所有可用的group yum groupinstall GNOME Desktop #安装 GNOME 桌面 yum -y ...

  7. A Simple Problem with Integers POJ - 3468 (线段树)

    思路:线段树,区间更新,区间查找 #include<iostream> #include<vector> #include<string> #include< ...

  8. 网站被攻击扫描SQL注入的日常记录

    我发了个博客,泄露了域名之后,便有人疯狂的尝试攻击我的站点,奈何我防守做得比较好,直接把网段封了,看到403还锲而不舍,我真是想给他颁奖了 查看ua,发现很多sqlmap的ua,肯定会是被刷了,只是运 ...

  9. html中有序列表标签ol,li的高级应用

    本文主要介绍html中有序列表标签ol,li的高级应用, 在网页设计时我们设计有序列表内容时,经常会在每个ITEM前手工加上一个数值,或是由程序加上这个数值. 而如果使用有序列表标签ol和li,则不需 ...

  10. 操作系统Lab1 详解(boot|kern/debug)

    总体 : boot kern libs tools boot asm.h bootmain.c bootasm.S asm.h 汇编头文件 SEG_NULLASM 定义一个空段描述符 SEG_ASM ...