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],问最小花费可 ...
随机推荐
- google bookmarket api
引用: 最近做了google书签同步的模块,发现google并没有公开bookmark相关的api接口,在网上也找了些资料,通过自己抓包分析,测试,总结下使用bookmark接口的心得,我是在andr ...
- 初识Python第二天(4)
'.isdecimal()) print('壹'.isdecimal()) print('11d'.isdecimal()) #True #False #False #只有全部为unicode数字,全 ...
- PostgreSQL Hot Standby的主备切换
一. 简介: PG在9.*版本后热备提供了新的一个功能,那就是Stream Replication的读写分离,是PG高可用性的一个典型应用.其中备库是只读库:若主库出现故障:备库这个 ...
- Unix/Linux编程实践教程(三:代码、测试)
测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示: logfilec.c:30: warning: pa ...
- 结合Apache和Tomcat实现集群和负载均衡 JK 方式
本文基本参考自 轻松实现Apache,Tomcat集群和负载均衡,经由实操经历记录而成,碰到些出入,以及个别地方依据个人的习惯,所以在一定程度上未能保持原文的完整性,还望原著者海涵. 因原文中有较多的 ...
- Tomcat6性能优化
1.内存设置 Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx51 ...
- 获取token,绑定微信号,自定义菜单,事件响应demo
摘要: 这个demo包含了获取token,绑定微信号,设置自定义菜单,响应文本和事件 这个教程的基础篇和提升篇都看完了,总感觉有点隔靴挠痒的感觉,讲的东西我都懂,没有吸收多少新鲜的知识.貌似还没有我这 ...
- [课程设计]Scrum 1. 8多鱼点餐系统开发进度(完善整个订餐页面工作)
[课程设计]Scrum 1. 8多鱼点餐系统开发进度(完善整个订餐页面工作) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题: ...
- lipo 合并target为Simulator和Device编译的静态库
进入项目对应的Build目录后,以下指令: $lipo -create Debug-iphoneos/libSalamaDeveloper.a Debug-iphonesimulator/libSal ...
- Android自定义View自定义属性
1.引言 对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现: 自定义一个CustomView(extends View )类 编写values/attrs.xml,在其中编写styleabl ...