一共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. Spring中bean的scope详解

    如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...

  2. biztalk重新发布

    前提:在vs2013中,项目属性:重新部署设置为true,重新启动主机实例:设置为true,或者在最后重新部署完以后手动重启主机实例 下面是具体的步骤: 1. 项目修改完重新生成.. 2. 转到biz ...

  3. 0511 backlog

    SCRUM 这次的作业就是确定SCRUM的计划,确定sprint backlog的一个冲刺周期,而这个周期是两个星期.争取在两周内发布1.0版本. 本次作业以网站构建为主: ID       NAME ...

  4. String.format中大括号的加入方法

    因为相对于string Builder  自己更喜欢 string.format 的形式拼接字符串。 今天在写代码的时候怎么都报错,弄的我很奇怪 最后发现问题出在字符串中出现大括号“{”的问题,我想这 ...

  5. ajax获取其他网站接口信息

    MXS&Vincene  ─╄OvЁ  &0000023─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

  6. Linux 多线程编程 实例 2

    编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. 使用条件变量来实现: #inc ...

  7. Linux之curl命令详解

    url命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类似的工具还有 ...

  8. [转] C语言常见笔试题大全1

    点击阅读原文 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL) [ ...

  9. shell脚本 空格

    1.定义变量时, =号的两边不可以留空格. eg: gender=femal----right gender =femal---–wrong gender= femal---–wrong 2.条件测试 ...

  10. mybatis动态SQL标签的用法

    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...