题目描述

输入

输出

输出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. 使用Tomcat过程中的常见问题

    1.点击startup.bat,启动Tomcat     DOS弹窗一闪而过 鼠标选中startup.bat这个文件,右键选择“编辑“,在末尾添加        pause

  2. Eureka配置问题

    在使用Spring Cloud做微服务开发中,经常会使用Eureka Server作为注册中心,如果配置不当可能会导致一些不可预期的异常信息.以下是我最近遇到的因为忽略了配置eureka.client ...

  3. Hibernate-实体-对象状态-一级缓存-事务-查询

    一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造         --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...

  4. 2019-10-11-VisualStudio-配置多进程调试快捷键启动项目

    title author date CreateTime categories VisualStudio 配置多进程调试快捷键启动项目 lindexi 2019-10-11 15:33:32 +080 ...

  5. 国内在Amazon fireTV或者fire平板下载应用(netflix\hulu\YouTube)的方法

    1.首先需要vpn翻墙至U.S. 2.需要一个美国亚马逊账户,并设置收货地址 (Manage Your Fire & Kindle 1-Click Payment Settings ),如果只 ...

  6. git与github建立链接(将本次项目与网络GitHub同步) --转存笔记

    转载自:https://blog.csdn.net/qq_36529459/article/details/79047220 1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可 ...

  7. Spring事务传播行为详解

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...

  8. 跟我一起做一个vue的小项目(一)

    项目架子 npm install --global vue-cli vue init webpack travel cd travel/ npm run dev 运行效果 添加home页及其路由,添加 ...

  9. 创建动态MSSQL数据库表的方法

    代码如下: ImportsSystem.Data ImportsSystem.Data.SqlClient PublicClassForm1 InheritsSystem.windows.Forms. ...

  10. 【logo】设计书籍的logo

    一个女孩发光般的看着,眼前发现的书籍 含义:这本书就是女孩想要得到的书籍 平台的宗旨:就是让学生能够得到想要的书籍 书籍来源:其他学生的书籍 目的:实现书籍回收再利用,同时让接受者低于市场价得到