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],问最小花费可 ...
随机推荐
- word转html方法
在网上看了一篇关于word转html的文章,感觉不错,和大家分享一下. /// <summary> /// word转成html /// </summary> /// < ...
- ilbc编解码
针对国内的博客或者技术论坛对 ILBC的论述都是把文章抄来抄去, 本人在此对 ILBC的具体代码实现详细列出代码. ILBC是由Global IP Sound公司提出的一种专为包交换网络通信设计的编解 ...
- Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展
在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...
- 自定义AlertView实现模态对话框
在Windows应用程序中,经常使用模态(Model)对话框来和用户进行简单的交互,比如登录框.在IOS应用程序中,有时我们也希望做同样的事情.但IOS的UI库中,没有模态对话框,最接近那个样子的应该 ...
- jQuery 遍历(上)
目录: 一:定义二:遍历 DOM三:jQuery 参考手册 - 遍历 定义:什么是遍历?jQuery 遍历,意为"移动",用于根据其相对于其他元素的关系来"查找" ...
- SourceTree 免登录跳过初始设置
SourceTree 安装之后需要使用账号登陆以授权,以前是可以不登陆的,但是现在是强制登陆. 虽然是免费授权,但是碰上不可抗力因素,登陆不是很方便,这里记录一下跳过这个初始化的步骤. 安装之后,转到 ...
- python(三)set集合
set集合的特点是无序.不重复序列 创建集合: 1 2 3 4 5 6 7 8 9 10 11 12 13 a.s1 = {11,22} b.s2 = set() c.s3 = set([11,22, ...
- Spring MVC 线程安全问题的思考
Spring MVC 线程安全问题的思考 在读一些博文的时候发现有些文章对SpringMVC的Controller线程安全的验证并不正确,比如没有探究controller线程不安全的具体原因,比如将请 ...
- [问题2014S04] 复旦高等代数II(13级)每周一题(第四教学周)
[问题2014S04] 设 \(A\in M_n(\mathbb{C})\) 为可对角化的 \(n\) 阶复方阵, \(f(x)\in\mathbb{C}[x]\) 为复系数多项式, 证明: \[B ...
- CRM系统简析
寄语: 简单阐述一下对CRM系统应用的理解,此内容参考网上资料所整理. CRM是Customer Relationship Management的缩写,简称客户关系管理. CRM系统可以从三个方面来分 ...