题目描述

输入

输出

输出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. create user

    create创建的用户,只有usage权限,即,连接数据库的权限,最低的权限. # 1.新建用户,这里的用户是由user_name 和ip一起唯一确定一个用户.# 2.若省略ip表达式,则表示%,即所 ...

  2. c++设计模式:策略模式

    1.主要思想:例如针对不同的算法,创建不同的类. #include <iostream> using namespace std; // The abstract strategy cla ...

  3. bootstrap--栅格系统布局

    栅格布局使用例子: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  4. 直接在安装了redis的Linux机器上操作redis数据存储类型--对Sorted-Sets操作

    一.概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score ...

  5. redis缓存使用详解

    mysql数据库是存在磁盘中的,操作是对于磁盘操作,这样访问量和并发很大时,运行速率就取决于磁盘的容量,带宽的大小和读取的方式,也就是 sql 语句,次数和效率也会影响读取效率.当访问量和并发很大的时 ...

  6. Java Servlet实现下载文件

    一.配置servlet 在WebContent(以前的eclipse版本是WebRoot)文件夹下,有一个web.xml 修改web.xml ,加入以下代码 <servlet> <s ...

  7. 汉诺塔III HDU - 2064

    汉诺塔III HDU - 2064   约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右 ...

  8. solr源码解读(转)

    solr源码解读(转)原文地址:http://blog.csdn.net/duck_genuine/article/details/6962624 配置 solr 对一个搜索请求的的流程 在solrc ...

  9. Mybatis+Spring实现Mysql读写分离

    使用spring AbstractRoutingDatasource实现多数据源 public class DynamicDataSource extends AbstractRoutingDataS ...

  10. jsp必填项加红色星号

    <th><font color=red>*</font>文字:</th>