一共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的更多相关文章

  1. hdu 2871 Memory Control(伸展树splay tree)

    hdu 2871 Memory Control 题意:就是对一个区间的四种操作,NEW x,占据最左边的连续的x个单元,Free x 把x单元所占的连续区间清空 , Get x 把第x次占据的区间输出 ...

  2. hdu 2871 Memory Control(线段树)

    题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...

  3. hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset  清空所有内存2.New x  分配一个大小为x的内存块返回,返 ...

  4. ●HDU 2871 Memory Control(Splay)

    ●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点 ...

  5. HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)

    传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...

  6. 【23.68%】【hdu 2871】Memory Control

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  7. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. HDU 5076 Memory

    Memory Time Limit: 4000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 50 ...

  9. HDU 4289:Control(最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ...

随机推荐

  1. 彻底的放弃.net

    最近看了招聘信息,搜一搜 .net 高级信息,发现对比 JAVA ,只有1页,而 JAVA 至少有3页. 最近用了一下嗒嗒巴士,滴滴打车,各种团购,各种外卖,各种移动互联网改变生活的东西,无一和 .n ...

  2. 桥接和nat模式区别

    bridged networking(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,你需要手工为虚拟系统配置IP地址 ...

  3. 纯CSS实现帅气的SVG路径描边动画效果(转载)

    本文转载自: 纯CSS实现帅气的SVG路径描边动画效果

  4. mfc ui3

    引用:http://www.cnblogs.com/rainbowzc/archive/2010/06/02/1749872.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者 ...

  5. CSS3 border-image详解、应用

    一.border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人.可惜目前支持的浏览器有限,仅Firefox3.5,chrom ...

  6. 介绍kali下的一些小工具

    1.macchanger 可以用来修改你的mac地址

  7. 161215、MySQL 查看表结构简单命令

    一.简单描述表结构,字段类型desc tabl_name;显示表结构,字段类型,主键,是否为空等属性,但不显示外键.二.查询表中列的注释信息select * from information_sche ...

  8. Burning Bridges-ZOJ1588(割边求解)

    Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...

  9. 关于使用nuget的部分代码

    Install-Package 安装包 -Version 4.3.1 参数指定版本 Uninstall-Package 卸载包 Update-Package 更新包 Get-Package 默认列出本 ...

  10. bootstrap-validator验证问题总结

    bootstrap-validator是一个优秀的验证器,使用中遇到如下问题,总结如下: 1.<button type="submit" name="submit2 ...