★★☆   输入文件:haoi13t4.in   输出文件:haoi13t4.out   简单对比
时间限制:1 s   内存限制:128 MB

Dr.Kong有一个容量为N MB (1 <= N <= 50,000)的存储磁盘,不妨设地址空间编号为1到N。现在他需要安装一些软件, 每个软件要占用一定大小的容量且必须装在连续的地址空间里。比如发出指令“1 100”,表示需要申请100 MB的存储空间。如果有多个满足条件的连续空间,则选择起始地址最小的一个进行分配。若没有足够的连续空间,将不安装此软件(即使有足够多的不连续存储空间)。

系统可以不定时的卸载软件,释放磁盘的空间。比如:发出“2 23 100”,表示释放起始地址为23的连续100MB大小的容量。释放时,不需要考虑这些空间里是否安装过软件。

请你编写一个程序,帮助Dr.Kong处理M (1 <= M <= 50,000)个按指令次序请求的任务。第一个请求到来前,磁盘是空的。

输入格式:

第1行: N  M

第2..M+1行: 每行描述了一个请求,如果是申请,则用2个数字 1 Mi 表示;

如果是释放,则用3个数字 2 Di Mi表示。数据之间用一个空格隔开

(1<=Di ,Mi<= 50,000)

输出格式:

对于每个申请指令,输出1行。如果请求能被满足,输出满足条件的最小起始地址;如果请求无法被满足,输出0。

输入样例 :

10 6

1 3

1 3

1 3

1 3

2 5 5

1 6

输出样例 :

1

4

7

0

5

线段树

屠龙宝刀点击就送

#include <cstdio>
#define N 50005 int n,M,m[N<<|],f[N<<|],lm[N<<|],rm[N<<|],siz[N<<|];
inline int min(int a,int b) {return a>b?b:a;}
inline int max(int a,int b) {return a>b?a:b;}
void pushup(int k)
{
m[k]=max(m[k<<],max(m[k<<|],rm[k<<]+lm[k<<|]));
if(m[k<<]==siz[k<<]) lm[k]=siz[k<<]+lm[k<<|];
else lm[k]=lm[k<<];
if(m[k<<|]==siz[k<<|]) rm[k]=siz[k<<|]+rm[k<<];
else rm[k]=rm[k<<|];
}
void build(int k,int l,int r)
{
f[k]=-;
m[k]=lm[k]=rm[k]=siz[k]=r-l+;
if(l==r) return;
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
inline void pushdown(int k)
{
if(siz[k]==) return;
f[k<<]=f[k];
f[k<<|]=f[k];
lm[k<<]=rm[k<<]=m[k<<]=siz[k<<]*f[k];
lm[k<<|]=rm[k<<|]=m[k<<|]=siz[k<<|]*f[k];
f[k]=-;
}
void modify(int k,int l,int r,int x,int y,int v)
{
if(l>=x&&r<=y)
{
lm[k]=rm[k]=m[k]=siz[k]*v;
f[k]=v;
return;
}
if(f[k]!=-) pushdown(k);
int mid=(l+r)>>;
if(x<=mid) modify(k<<,l,mid,x,y,v);
if(y>mid) modify(k<<|,mid+,r,x,y,v);
pushup(k);
}
int query(int k,int l,int r,int x)
{
if(m[k]==x&&lm[k]==x) return l;
if(f[k]!=-) pushdown(k);
int mid=(l+r)>>;
if(m[k<<]>=x) return query(k<<,l,mid,x);
if(rm[k<<]+lm[k<<|]>=x) return mid-rm[k<<]+;
if(m[k<<|]>=x) return query(k<<|,mid+,r,x);
pushup(k);
}
int Main()
{
freopen("haoi13t4.in","r",stdin);
freopen("haoi13t4.out","w",stdout);
scanf("%d%d",&n,&M);
build(,,n);
for(int opt,di,mi,p;M--;)
{
scanf("%d",&opt);
if(opt==)
{
scanf("%d",&mi);
if(m[]<mi) {puts("");goto flag;}
p=query(,,n,mi);
modify(,,n,p,p+mi-,);
printf("%d\n",p);
}
else
{
scanf("%d%d",&di,&mi);
modify(,,n,di,min(di+mi-,n),);
}
flag:;
}
fclose(stdin); fclose(stdout);
return ;
}
int sb=Main();
int main(int argc,char *argv[]){;}

COGS 1365. [HAOI2013] 软件安装的更多相关文章

  1. cogs 444. [HAOI2010]软件安装

    ★★☆   输入文件:install.in   输出文件:install.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述]现在我们的手头有N个软件,对于一个软件i,它要 ...

  2. 源码包---linux软件安装与管理

    源代码推荐保存位置: /usr/local/src 软件安装位置: /usr/local 如何确定安装过程报错: 安装过程停止 并出现error / warning / no 的提示 ./config ...

  3. yum---Linux软件安装与管理

    查询: yum list #查询所有可用的软件包列表 yum search keywords #搜索服务器上所有和关键字相关的软件包 安装: yum -y install 包名 options: in ...

  4. [Tool]Inno Setup创建软件安装程序。

    这篇博客将介绍如何使用Inno Setup创建一个软件安装程序. Inno Setup官网:http://www.jrsoftware.org/isinfo.php. 可以下载到最新的Inno Set ...

  5. js通过注册表找到本地软件安装路径并且执行

    场景:用js执行本地的安装软件,如果不存在就执行安装 操作步骤: 1.前台js代码 <script type="text/javascript"> function e ...

  6. 全新 Mac 安装指南(通用篇)(推荐设置、软件安装、推荐软件)

    注:本文将会不定期维护与更新,有需要的朋友请在 Github 上订阅该条 Issues:<全新 Mac 安装指南(通用篇)>. 在 Mac 电脑上只用 Windows 操作系统的同学请看到 ...

  7. Linux第一天 ssh登录和软件安装详解

    Linux学习第一天 操作环境: Ubuntu 16.04 Win10系统,使用putty_V0.63 本身学习Linux就是想在服务器上使用的.实际情况,可能我很难直接到坐在服务器前,使用界面操作系 ...

  8. ubuntu一些基本软件安装方法

    ubuntu一些基本软件安装方法 首先说明一下 ubuntu 的软件安装大概有几种方式:1. deb 包的安装方式deb 是 debian 系 Linux 的包管理方式, ubuntu 是属于 deb ...

  9. 【BZOJ-2427】软件安装 Tarjan + 树形01背包

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 960  Solved: 380[Submit][Status ...

随机推荐

  1. ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法-转

    using System.Data.SqlClient;...SqlConnection conn = new SqlConnection(@"server=ws7\leosql;datab ...

  2. Boost Python学习笔记(四)

    你将学到什么 在Python中调用C++代码时的传参问题 基础类型 Python的字符串是常量,所以C++函数参数中的std::string &必须为const 修改源文件(main.cpp) ...

  3. 洛谷P4332 [SHOI2014]三叉神经树(LCT)

    传送门 FlashHu大佬太强啦%%% 首先,我们可以根据每一个点的权值为$1$的儿子的个数把每个点记为$0~3$,表示这一个点的点权 先考虑一下暴力的过程,假设从$0$变为$1$,先更改一个叶子结点 ...

  4. AT2689 Prime Flip

    传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...

  5. 小程序启用slot -- 传入 wxml标签

    options:{ multipleSlots:true } 直接看:https://www.jianshu.com/p/b22c9e075931

  6. mac安装scrapy

    Mac自带python2.7,所以直接安装scrapy.默认安装了Xcode总共分以下几步:1.安装 homebrew.wget2.安装pip3.安装scrapy 安装homebrew在termina ...

  7. Vue axios 中提交表单数据(含上传文件)

    伟大的画家都是先从模仿开始 的,我写的不好,很多还是抄袭,就是想提高自己的水平,没准坚持下来,我就变成一个厉害的角色了呢?

  8. BZOJ 4165 矩阵 堆

    先把每个长为$mina$,宽为$minb$的矩阵扔到堆里,然后由于矩阵中的数都是正的,所以我们每取出来一个矩形,,就把他向四个方向扩张一行,再把这新的且更大的四个矩形扔到堆里.注意判重,于是我比较懒用 ...

  9. Spring 学习(三)AOP

    (1)AOP概述 - AOP:面向切面编程,扩展功能不修改源代码实现 - AOP采取横向抽取机制,取代了传统的纵向继承体系重复性代码 (2)AOP底层原理 原始方法------->纵向继承体系 ...

  10. 四,JVM 自带命令行工具之JStack

    jstack(stack trace for java) 命令 用于查看虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件).线程快照就是当前虚拟机内每一条线程正在执行的方 ...