HDU 2871 Memory Control
一共4种操作
其中用线段树 区间合并,来维护连续空的长度,和找出那个位置。其他用vector维护即可
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include <iostream>
#include<vector>
#define lson i<<1
#define rson i<<1|1
#define N 50050
using namespace std;
struct node
{
int l,r;
};
bool operator<(node a,node b)
{
return a.l<b.l;
}
vector<node>e;
int lsum[N*],rsum[N*],msum[N*];
int flag[N*];
inline int max(int x,int y)
{
return x>y?x:y;
}
void pushup(int i,int l,int r)
{
int mid=(l+r)>>;
lsum[i]=lsum[lson];
rsum[i]=rsum[rson];
if(lsum[i]==mid-l+)
lsum[i]+=lsum[rson];
if(rsum[i]==r-mid)
rsum[i]+=rsum[lson];
msum[i]=max(msum[lson],msum[rson]);
msum[i]=max(msum[i],rsum[lson]+lsum[rson]);
}
void pushdown(int i,int l,int r)
{
if(flag[i]!=-)
{
int mid=(l+r)>>;
flag[lson]=flag[rson]=flag[i];
lsum[lson]=rsum[lson]=msum[lson]=(mid-l+)*flag[i];
lsum[rson]=rsum[rson]=msum[rson]=(r-mid)*flag[i];
flag[i]=-;
}
}
void build(int l,int r,int i)
{
flag[i]=-;
lsum[i]=rsum[i]=msum[i]=r-l+;
if(l==r)
return ;
int mid=(l+r)>>;
build(l,mid,lson);
build(mid+,r,rson);
}
void update(int l,int r,int pl,int pr,int va,int i)
{
if(l>=pl&&r<=pr)
{
flag[i]=va;
rsum[i]=lsum[i]=msum[i]=(r-l+)*va;
return ;
}
pushdown(i,l,r);
int mid=(l+r)>>;
if(pl<=mid)update(l,mid,pl,pr,va,lson);
if(pr>mid)update(mid+,r,pl,pr,va,rson);
pushup(i,l,r);
}
int query(int l,int r,int va,int i)
{
if(msum[i]==r-l+)
return l;
pushdown(i,l,r);
int mid=(l+r)>>;
if(msum[lson]>=va)
return query(l,mid,va,lson);
else if(rsum[lson]+lsum[rson]>=va)
return mid-rsum[lson]+;
else
return query(mid+,r,va,rson);
}
int main() {
int n,m;
char s[];
while(scanf("%d%d",&n,&m)!=EOF)
{
build(,n,);
e.clear();
while(m--)
{
int x;
vector<node>::iterator it;
node d;
scanf(" %s",s);
if(s[]=='N')
{
scanf("%d",&x);
if(msum[]<x)
puts("Reject New");
else
{
int tmp=query(,n,x,);
printf("New at %d\n",tmp);
d.l=tmp;d.r=tmp+x-;
update(,n,tmp,tmp+x-,,);
it=upper_bound(e.begin(),e.end(),d);
e.insert(it,d);
}
}
else if(s[]=='F')
{
scanf("%d",&x);
d.l=x;d.r=x;
it=upper_bound(e.begin(),e.end(),d);
int tmp=it-e.begin()-;
if(tmp<||e[tmp].l>x||e[tmp].r<x)
printf("Reject Free\n");
else
{
printf("Free from %d to %d\n",e[tmp].l,e[tmp].r);
update(,n,e[tmp].l,e[tmp].r,,);
e.erase(e.begin()+tmp);
}
}
else if(s[]=='G')
{
scanf("%d",&x);
if(e.size()<x)
puts("Reject Get");
else
printf("Get at %d\n",e[x-].l);
}
else
{
update(,n,,n,,);
e.clear();
puts("Reset Now");
}
}
printf("\n");
}
return ;
}
HDU 2871 Memory Control的更多相关文章
- hdu 2871 Memory Control(伸展树splay tree)
hdu 2871 Memory Control 题意:就是对一个区间的四种操作,NEW x,占据最左边的连续的x个单元,Free x 把x单元所占的连续区间清空 , Get x 把第x次占据的区间输出 ...
- hdu 2871 Memory Control(线段树)
题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...
- hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset 清空所有内存2.New x 分配一个大小为x的内存块返回,返 ...
- ●HDU 2871 Memory Control(Splay)
●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点 ...
- HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)
传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...
- 【23.68%】【hdu 2871】Memory Control
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 5076 Memory
Memory Time Limit: 4000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 50 ...
- HDU 4289:Control(最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ...
随机推荐
- paper 103:ELM算法
ELM(Extreme Learning Machine)是一种新型神经网络算法,最早由Huang于2004年提出[Extreme learning machine: a new learning s ...
- POJ - 2183 Bovine Math Geniuses
“模拟“题,运用哈希,不断地按照一定运算规律对一个结果进行计算,如果重复出现就停止并且输出该数.注意到仔细看题,这种题一定要细心! POJ - 2183 Bovine Math Geniuses Ti ...
- phpcms V9 数据模型基类
在学习<phpcms V9首页模板文件解析>的第七步,我们看到content_model类,文件路径:phpcms/model/content_model.class.php 从代码中,可 ...
- Apple个人(Individual)开发者账号升级公司(Company)开发者账号
1.拨打苹果针对中国区开发者的咨询服务热线:4006 701 855: 2.简单向对方(中文不太标准,但听懂没问题)说明意图后,会要求提供: (1)之前申请IDP时purchase form上的per ...
- Super Ugly Number
eg 2,3,5 把第一个元素(2,1)放到最小堆,2表示乘积,1表示乘数 乘数 队列 最小堆 即将进 ...
- .sh脚本判断判断某一变量是否为某一数值
.sh脚本中,判断某一变量(例如:OEM_CUSTOMER_SUPPORT)是否为某一数值(例如:0),并根据条件做不同处理,写法如下: if [ $OEM_CUSTOMER_SUPPORT -eq ...
- 规则引擎以及blaze 规则库的集成初探之三——Blaze规则引擎和SRL
原文地址:http://jefferson.iteye.com/blog/68604 在上面介绍利用JSR94的api使用的章节中,我们使用的具体引擎的实现是一个商业产品,如果想了解Drools的使用 ...
- 【Linux命令与工具】磁盘与目录的容量——df和du
df(disk free):列出文件系统的整体磁盘使用量 用法: df [-akmhi] [目录或文件名] 参数: -a: 列出所有的文件系统,包括系统特有的/proc等文件系统 -k: 以KB的容量 ...
- 【Tarjan】+【SPFA】APIO2009 Atm
一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...
- cas的http配置和rmi远程调用
1.cas配置http请求(服务端) 1) 解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.w ...