hdu-2871
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=;
using namespace std;
int lsum[maxn<<],rsum[maxn<<],sum[maxn<<];
int cover[maxn<<],st[maxn],ed[maxn];
set<int>s;
set<int>::iterator itr;
void pushUp(int rt,int m)
{
rsum[rt]=rsum[rt<<|];
lsum[rt]=lsum[rt<<];
if(lsum[rt]==(m-(m>>)))
lsum[rt]=lsum[rt]+lsum[rt<<|];
if(rsum[rt]==m>>)
rsum[rt]=rsum[rt]+rsum[rt<<];
sum[rt]=max(rsum[rt<<]+lsum[rt<<|],max(sum[rt<<],sum[rt<<|]));
}
void pushdown(int rt,int m)
{
if(cover[rt]!=){
cover[rt<<]=cover[rt<<|]=cover[rt];
sum[rt<<]=lsum[rt<<]=rsum[rt<<]=cover[rt]!=-?:m-(m>>);
sum[rt<<|]=lsum[rt<<|]=rsum[rt<<|]=cover[rt]!=-?:m>>;
cover[rt]=;
}
}
void build(int l,int r,int rt)
{
sum[rt]=lsum[rt]=rsum[rt]=r-l+;
cover[rt]=-;
if(l==r) return ;
int m=(l+r)>>;
build(lson);
build(rson);
pushUp(rt,r-l+);
}
int query(int d,int l,int r,int rt)
{
if(l==r) return l;
pushdown(rt,r-l+);
int m=(l+r)>>;
if(sum[rt<<]>=d) return query(d,lson);
else if(rsum[rt<<]+lsum[rt<<|]>=d) return m-rsum[rt<<]+;
return query(d,rson);
}
void update(int d,int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
sum[rt]=lsum[rt]=rsum[rt]=d>?:r-l+;
cover[rt]=d;
return;
}
int m=(l+r)>>;
pushdown(rt,r-l+);
if(L<=m) update(d,L,R,lson);
if(R>m) update(d,L,R,rson);
pushUp(rt,r-l+);
}
int getID(int d,int l,int r,int rt)
{
if(cover[rt]) return cover[rt];
int m=(l+r)>>;
if(d<=m) return getID(d,lson);
else return getID(d,rson);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
s.clear();
build(,n,);
for(int i=;i<=m;i++){
char str[];
int d;
scanf("%s",str);
if(str[]=='N'){
scanf("%d",&d);
if(d>sum[])
printf("Reject New\n");
else{
int a=query(d,,n,);
st[i]=a;ed[i]=a+d-;
s.insert(a);
update(i,a,a+d-,,n,);
printf("New at %d\n",a);
}
}
if(str[]=='F')
{
scanf("%d",&d);
int state=getID(d,,n,);
if(state==-) printf("Reject Free\n");
else
{
update(-,st[state],ed[state],,n,);
s.erase(st[state]);
printf("Free from %d to %d\n",st[state],ed[state]);
}
}
if(str[]=='G'){
scanf("%d",&d);
int num=;
for(itr=s.begin();itr!=s.end();itr++){
num++;
if(num==d){
printf("Get at %d\n",*itr);
break;
}
}
if(num<d) printf("Reject Get\n");
}
if(str[]=='R') {
cover[]=-;
sum[]=lsum[]=rsum[]=n;
s.clear();
printf("Reset Now\n");
}
}
printf("\n");
}
return ;
}
hdu-2871的更多相关文章
- hdu 2871 Memory Control(伸展树splay tree)
hdu 2871 Memory Control 题意:就是对一个区间的四种操作,NEW x,占据最左边的连续的x个单元,Free x 把x单元所占的连续区间清空 , Get x 把第x次占据的区间输出 ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 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
一共4种操作 其中用线段树 区间合并,来维护连续空的长度,和找出那个位置.其他用vector维护即可 #include<cstring> #include<cstdio> #i ...
- ●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 ...
- ACM数据结构相关资料整理【未完成,待补充】
在网上总是查不到很系统的练ACM需要学习的数据结构资料,于是参考看过的东西,自己整理了一份. 能力有限,欢迎大家指正补充. 分类主要参考<算法竞赛入门经典训练指南>(刘汝佳),山东大学数据 ...
- hdu 3642 Get The Treasury
Get The Treasury http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Othe ...
随机推荐
- 高级函数-case
case函数 (适合区间,>,<判断) case when 判断表达式 then when 判断表达式 then ..... end s ...
- 电子签章盖章之jQuery插件jquery.zsign
简介: 使用jquery.zsign可以实现电子签章盖章效果,使用方便,只需提供自己的章图片.效果图如下: 页面引用: <link href=&quo ...
- HDU 4310 Contest 2
贪心,注意排序条件. #include <iostream> #include <cstdio> #include <algorithm> using namesp ...
- CentOS 安装SVNclient
1.检查是已经安装了svn: # rpm -qa subversion subversion-1.7.14-6.el7.x86_64 卸载旧版本号的svn: # yum remove subversi ...
- Java知识点解析
JAVA 1:简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是为家用消费电子产品 发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等. 2:简单写出Jav ...
- 机器翻译引擎的基本原理 ——LSTM
机器翻译引擎的基本原理 摘自:infoq 谷歌机器翻译 Zero-shot:零次 Training:训练 Google Neural Machine Translation:谷歌神经机器翻译 我们每 ...
- BZOJ 3166 set+可持久化trie树(OR 莫队)
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By Siriu ...
- Scrapy中scrapy.Request和response.follow的区别
在写scrapy的spider类的parse方法的时候,有些链接需要提取出来继续爬取,这里scrapy提供了一些方法可以方便的实现这个功能,总结如下: 假设我们的目标a标签是target_a 方法1: ...
- 学习es6 setter/getter研究
1.背景 在ES6中,我们对类的定义如下 class Person { // 构造函数 constructor (name) { // 属性初始化 this.name = name; } // 成员方 ...
- jqGrid系列知识
1.获取选中到行的ID var rowKey = jQuery(grid_selector).getGridParam("selrow"); 2.获取选中行除ID之外的数据 var ...