题目描述

输入

输出

输出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))。

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

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

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

离线处理即可。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define ll long long
  7. #define sqr(x) ((x)*(x))
  8. #define ln(x,y) ll(log(x)/log(y))
  9. using namespace std;
  10. const char* fin="ex3571.in";
  11. const char* fout="ex3571.out";
  12. const ll inf=0x7fffffff;
  13. const ll maxn=100007*2,maxt=maxn*4;
  14. ll n,m,i,j,k,l,rank[maxn],b[maxn],d[maxn];
  15. struct prog{
  16. ll get,need,id;
  17. void operator=(const prog &b){
  18. get=b.get;
  19. need=b.need;
  20. id=b.id;
  21. }
  22. prog(){
  23. get=need=id=0;
  24. }
  25. }a[maxn],c[maxt];
  26. prog merge(prog a,prog b){
  27. prog c;
  28. c.need=max(a.need,b.need-a.get);
  29. c.get=a.get+b.get;
  30. return c;
  31. }
  32. bool cmp(prog a,prog b){
  33. return a.need<b.need;
  34. }
  35. void change(ll l,ll r,ll t,ll v,const prog &v1){
  36. ll mid=(l+r)/2;
  37. if (l==r){
  38. c[t]=v1;
  39. return ;
  40. }
  41. if (v<=mid) change(l,mid,t*2,v,v1);
  42. else change(mid+1,r,t*2+1,v,v1);
  43. c[t]=merge(c[t*2],c[t*2+1]);
  44. }
  45. int main(){
  46. scanf("%d%d",&n,&m);
  47. for (i=1;i<=n;i++){
  48. scanf("%d%d",&a[i].get,&a[i].need);
  49. a[i].id=i;
  50. }
  51. for (i=n+1;i<=n+m;i++){
  52. scanf("%d%d%d",&b[i],&k,&l);
  53. a[i].need=l;
  54. a[i].get=k;
  55. a[i].id=i;
  56. }
  57. sort(a+1,a+n+m+1,cmp);
  58. for (i=1;i<=n+m;i++) rank[a[i].id]=i;
  59. for (i=1;i<=n;i++) change(1,n+m,1,rank[i],a[rank[i]]),d[i]=rank[i];
  60. for (i=n+1;i<=n+m;i++){
  61. change(1,n+m,1,d[b[i]],c[0]);
  62. change(1,n+m,1,rank[i],a[rank[i]]);
  63. d[b[i]]=rank[i];
  64. printf("%lld\n",c[1].need);
  65. }
  66. return 0;
  67. }

启发

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

可以考虑合并元素;

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

【时光回溯】【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. MyEclipse6.5安装SVN插件方法

    MyEclipse6.5安装SVN插件,掌握了几种方法,本节就像大家介绍一下MyEclipse6.5安装SVN插件的三种方法,看完本文你肯定有不少收获,希望本文能教会你更多东西. 一.安装方法: My ...

  2. 解决导入TensorFlow后出现警告的的问题解决:通过降低numpy的版本

    在原有基础上安装tensorflow 重新虚拟出一个环境安装tensorflow 安装 测试 大多教程都是重新虚拟出一个环境,原有环境就可以支持为什么还要重建一个新的环境,如果以后遇到坑了更新解释. ...

  3. LA4670 Dominating Patterns AC自动机模板

    Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include ...

  4. ubuntn16.04指令

    基础知识: ubuntn中的/表示根目录,包括bin,mnt等文件夹 /home表示家目录,/home/user表示用户下的家目录,/root表示root目录 常用指令: 进入root : sudo ...

  5. Lvs 环境搭建 vbox搭建centos6.9 vbox设置 centos上安装nginx

    1.现在vbox上虚拟出3个虚拟机,分别为负载均衡器(Load Balance).实际服务器1(Real server1).实际服务器2(Real Server2) 要点: :vbox系统网络连接方式 ...

  6. javax.el.PropertyNotFoundException: Property 'studentAge' not found on type com.hs.model.StudentModel

    mi明明已经把这个字段重构了,为啥还这样提示呢?整个工程全部 查找也找不到这个字段了啊

  7. neo4j中对节点关系和聚类的思考

    由于neo4j在查找过程中具有事务,所以查询的速度非常慢!给出的建议如下: 一,将所有查询放在一个Session中,当所有查询完毕以后在关闭Driver和Session: 二,使用neo4j连接池,使 ...

  8. 学习JDK1.8集合源码之--HashMap

    1. HashMap简介 HashMap是一种key-value结构存储数据的集合,是map集合的经典哈希实现. HashMap允许存储null键和null值,但null键最多只能有一个(HashSe ...

  9. 【CRT相关配置】

    1.选项——会话选项 2.回话调整如下: 3.日志文件记录保存,即保存所有输入的命令 文件名:%S-%T-%M-%D.txt,表示每天会存放到一个文件 选择:在连接上启动记录 和  追加到文件

  10. 微信小程序制作选项卡

    wxml: <view class="tab"><view class="tab-title" bindtap="tabFun&qu ...