★★☆   输入文件: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. 【关于java多线程和socket通信的一些记录】---高并发/高负载/高可用/重入锁

    多线程:提高cpu的使用效率,多线程是指在同一程序中有多个顺序流在执行. 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线 ...

  2. H5 简介

    HTML5 - 新特性 HTML5 的一些最有趣的新特性: 新的语义元素,比如 <header>, <footer>, <article>, and <sec ...

  3. jq写的上拉刷新

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Java——利用集合类实现简单斗地主发牌

    import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util ...

  5. 面试d090305知识点准备01

    1.1  类成员访问[jL1] 权限 1.2  写个双线程,计算50内的奇偶数 1.3  打印等腰三角形 1.4  运算符优先级 括号,非正负和自增减(右到左),乘除加减,等于不等于,逻辑与和或,然后 ...

  6. thinkphp5.1composer引入第三方类库使用注意

    下面以引入phpspider为例子: composer引入: composer require owner888/phpspider 这时在vender目录下会多出一个owner888目录,里面就有我 ...

  7. luogu P5142 区间方差 十分优美的线段树

    又来了个维护方差的线段树.... 大致推导过程(字丑多包涵QAQ) 注意取模时要加一些100000007防止出现负数.. #include<cstdio> #include<iost ...

  8. django 请求生命周期

    详细例子:

  9. hdu3949(线性基,求第k小的异或和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 XOR Time Limit: 2000/1000 MS (Java/Others)    Me ...

  10. malloc内存申请--释放-收缩

     一.验证思路和代码 #include <stdio.h> #include <unistd.h> #include <malloc.h> #include < ...