COGS 1365. [HAOI2013] 软件安装
★★☆ 输入文件: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] 软件安装的更多相关文章
- cogs 444. [HAOI2010]软件安装
★★☆ 输入文件:install.in 输出文件:install.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述]现在我们的手头有N个软件,对于一个软件i,它要 ...
- 源码包---linux软件安装与管理
源代码推荐保存位置: /usr/local/src 软件安装位置: /usr/local 如何确定安装过程报错: 安装过程停止 并出现error / warning / no 的提示 ./config ...
- yum---Linux软件安装与管理
查询: yum list #查询所有可用的软件包列表 yum search keywords #搜索服务器上所有和关键字相关的软件包 安装: yum -y install 包名 options: in ...
- [Tool]Inno Setup创建软件安装程序。
这篇博客将介绍如何使用Inno Setup创建一个软件安装程序. Inno Setup官网:http://www.jrsoftware.org/isinfo.php. 可以下载到最新的Inno Set ...
- js通过注册表找到本地软件安装路径并且执行
场景:用js执行本地的安装软件,如果不存在就执行安装 操作步骤: 1.前台js代码 <script type="text/javascript"> function e ...
- 全新 Mac 安装指南(通用篇)(推荐设置、软件安装、推荐软件)
注:本文将会不定期维护与更新,有需要的朋友请在 Github 上订阅该条 Issues:<全新 Mac 安装指南(通用篇)>. 在 Mac 电脑上只用 Windows 操作系统的同学请看到 ...
- Linux第一天 ssh登录和软件安装详解
Linux学习第一天 操作环境: Ubuntu 16.04 Win10系统,使用putty_V0.63 本身学习Linux就是想在服务器上使用的.实际情况,可能我很难直接到坐在服务器前,使用界面操作系 ...
- ubuntu一些基本软件安装方法
ubuntu一些基本软件安装方法 首先说明一下 ubuntu 的软件安装大概有几种方式:1. deb 包的安装方式deb 是 debian 系 Linux 的包管理方式, ubuntu 是属于 deb ...
- 【BZOJ-2427】软件安装 Tarjan + 树形01背包
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 960 Solved: 380[Submit][Status ...
随机推荐
- Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)
题目链接 C. Hacking Cyphertime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...
- 同台电脑 多Git账号同时使用
前言 有次周末忘记带公司电脑回来,恰好遇到有个问题需要修复,又不想跑公司一趟,于是研究了下如何在自己电脑上同时使用两个 git 账号 正文 1. 首先就和第一次安装 git 时一样,使用 sha算法 ...
- 树莓派配置(一):打开SPI
1.树莓派默认SPI关闭,在进行编程前需要打开SPI cd /boot/ sudo vi config.txt 将#dtparam=spi=off 改成:dtparam=spi=on 重启 sudo ...
- ProtoBuf练习(三)
任意类型 protobuf语言的任意字段类型相当于Boost库的boost::any类型数据,google.protobuf.Any是对protobuf语言的message进行封装,所以需要使用mes ...
- iOS 面试全方位剖析 -- Block篇
1.Block的本意 block本质上也是一个OC对象,它内部也有个isa指针, block是封装了函数调用以及函数调用环境的OC对象, block是封装函数及其上下文的OC对象 2.block截获变 ...
- MySQL的CURRENT_DATE(),NOW(),DATE_FORMAT()函数的应用,类型转换及操作汇总
内容简介 datetime类型和timestamp类型的取值范围,CURRENT_DATE()函数应用,NOW()函数应用,DATE_FROMAT()函数取星期,日期.字符串.时间戳相互转换等. 时间 ...
- 实现html页面只自动跳转一次
function show(){ var value= sessionStorage.getItem("flg"); if(value==null || value==undef ...
- ICP备案接入商
1. 什么是ICP备案中的接入商 ICP备案系统中所说的接入商:是指为您提供虚拟主机.服务器托管或者专线接入的公司. 现在ICP备案的原则是“谁接入谁负责”,接入商一般都有自己的电子平台和工信部对接, ...
- 树的直径 【bzoj3363】[Usaco2004 Feb]Cow Marathon 奶牛马拉松
3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松 Description 最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松.马拉 松路线要尽 ...
- ldap第一天 编译安装LDAP + ldapadmin
此文整理学习此大神的博客:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26168435&id=5746284 一.环 ...