用vector进行插入和删除操作!

总是有些地方处理不好,对拍了才知道错在哪里,,

/*
给定一些操作
reset 清空
new a ,申请最左边的连续a个空间
free a,清空a所在的块
get x,求第x块的起始地址
用个vector<pair<int,int> >记录第i个块的覆盖区间
new时二分找到a所在的pair,进行insert
清空时二分找到a所在的pair,进行erase即可
求第x块的起始地址只要去vector里找一下即可
*/
#include<bits/stdc++.h>
#include<vector>
using namespace std;
#define maxn 50005
int n,m;
vector<pair<int,int> >v;
vector<pair<int,int> >::iterator it;
int cmp(pair<int,int> a,pair<int,int> b){return a.first<b.first;} #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int lazy[maxn<<],mx[maxn<<],lmx[maxn<<],rmx[maxn<<];
void set0(int l,int r,int rt){mx[rt]=lmx[rt]=rmx[rt]=lazy[rt]=;}
void set1(int l,int r,int rt){mx[rt]=lmx[rt]=rmx[rt]=r-l+;lazy[rt]=;}
void pushup(int l,int r,int rt){
lmx[rt]=lmx[rt<<],rmx[rt]=rmx[rt<<|];
mx[rt]=max(mx[rt<<],mx[rt<<|]);
mx[rt]=max(mx[rt],rmx[rt<<]+lmx[rt<<|]);
int m=l+r>>;
if(lmx[rt<<]==m-l+)lmx[rt]=lmx[rt<<|]+m-l+;
if(rmx[rt<<|]==r-m)rmx[rt]=rmx[rt<<]+r-m;
}
void pushdown(int l,int r,int rt){
int m=l+r>>;
if(lazy[rt]==-)return;
else if(lazy[rt]==)set0(lson),set0(rson);
else set1(lson),set1(rson);
lazy[rt]=-;
}
void build(int l,int r,int rt){
lazy[rt]=-;
if(l==r){mx[rt]=lmx[rt]=rmx[rt]=;return;}
int m=l+r>>;
build(lson);build(rson);
pushup(l,r,rt);
}
void update0(int L,int R,int l,int r,int rt){
if(L<=l && R>=r){set0(l,r,rt);return;}
int m=l+r>>;
pushdown(l,r,rt);
if(L<=m)update0(L,R,lson);
if(R>m)update0(L,R,rson);
pushup(l,r,rt);
}
void update1(int L,int R,int l,int r,int rt){
if(L<=l && R>=r){set1(l,r,rt);return;}
int m=l+r>>;
pushdown(l,r,rt);
if(L<=m)update1(L,R,lson);
if(R>m)update1(L,R,rson);
pushup(l,r,rt);
}
int query(int cnt,int l,int r,int rt){
if(l==r)return l;
pushdown(l,r,rt);
int m=l+r>>;
if(cnt<=mx[rt<<])return query(cnt,lson);
else if(cnt<=rmx[rt<<]+lmx[rt<<|])return m-rmx[rt<<]+;
else return query(cnt,rson);
} int main(){
while(cin>>n>>m){
build(,n,);
v.clear();
while(m--){
char opt[];int a;
scanf("%s",opt);
if(opt[]!='R')scanf("%d",&a);
if(opt[]=='N'){//申请连续a个空间
if(mx[]<a){
puts("Reject New");
continue;
}
int pos=query(a,,n,);
printf("New at %d\n",pos);
update0(pos,pos+a-,,n,);//这一段被占用了
pair<int,int>tmp=make_pair(pos,pos+a-);
it=upper_bound(v.begin(),v.end(),tmp,cmp);
v.insert(it,tmp);
}
if(opt[]=='F'){//释放a所在的块
pair<int,int>tmp=make_pair(a,a);
it=upper_bound(v.begin(),v.end(),tmp,cmp);//找第一个比tmp大的块
int p=it-v.begin()-;
if(p==- || v[p].second<a){
puts("Reject Free");
continue;
}
printf("Free from %d to %d\n",v[p].first,v[p].second);
update1(v[p].first,v[p].second,,n,);
v.erase(v.begin()+p);
}
if(opt[]=='R'){
update1(,n,,n,);
v.clear();
puts("Reset Now");
}
if(opt[]=='G'){
if(v.size()<a)puts("Reject Get");
else printf("Get at %d\n",v[a-].first);
}
}
puts("");
}
}

hdu2871 区间合并(类似poj3667)+vector应用的更多相关文章

  1. poj3667 Hotel (线段树 区间合并)

    poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...

  2. 区间合并 POJ3667+HDU4553

    两道题都是线段树的区间合并 lsum, rsum分别表示左/右端点 开始向右/左 符合条件的元素的最长连续长度 sum表示这个区间的符合条件的元素的最长连续长度 所以pushUp可写: void pu ...

  3. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  4. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  5. poj3667(线段树区间合并&区间查询)

    题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...

  6. HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

    Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Lim ...

  7. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  8. POJ 2750 Potted Flower (线段树区间合并)

    开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并...  给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...

  9. ACM: Hotel 解题报告 - 线段树-区间合并

    Hotel Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description The ...

随机推荐

  1. python 生成器的GeneratorExit异常

    转载自:https://blog.csdn.net/hedan2013/article/details/72810653 当一个生成器对象被销毁时,会抛出一个GeneratorExit异常.请看下面的 ...

  2. react-踩坑记录——swiper报错!

    已经在html文件中使用过,正确无误:但做成组件后(各种依赖文件引入路径确认无误)报错. 在只引入swiper.css时未报错,引入swiper.js文件后报错,如下: 错误原因,不详. 解决措施,不 ...

  3. 不使用setCustomView,设置ActionBar标题居中

    仅供参考,有太多自定义标题栏需求时,还是建议使用setCustomView https://blog.csdn.net/chiceT/article/details/50455358

  4. Required String parameter 'images' is not present

    后台控制层控制为非必填即可: @RequestMapping("/addDo") @SJson @SLog(description = "Car_main") ...

  5. 从无文件技术到使用隐写术:检查Powload的演变

    来源:https://blog.trendmicro.com/trendlabs-security-intelligence/from-fileless-techniques-to-using-ste ...

  6. LwIP Application Developers Manual9---LwIP and multithreading

    1.前言 lwIP的内核并不是线程安全的.如果我们必须在多线程环境里使用lwIP,那么我们必须使用“upper”API层的函数(netconn或sockets).当使用raw API时,你需要自己保护 ...

  7. Linux将rm命令设置为回收站【转】

    一个方案就是重定向 rm 命令以嫁接为 mv 命令,相当于给 Linux 系统定制了一个回收站. 实现方式如下: ### 重定义rm命令 ### # 定义回收站目录 trash_path='~/.tr ...

  8. 初识python异步模块Trio

    Trio翻译过来是三重奏的意思,它提供了更方便异步编程,是asyncio的更高级的封装. 它试图简化复杂的asyncio模块.使用起来比asyncio和Twisted要简单的同时,拥有其同样强大功能. ...

  9. sed 随笔

    1)sed 功能说明 sed     全称    stream editor    基本功能    增删改查    过滤    取行 语法格式: sed  [options]  [sed-comman ...

  10. PCM EQ DRC 音频处理

    PCM Pulse-code modulation的缩写,中文译名是脉冲编码调制.(I2S仅仅是PCM的一个分支,接口定义都是一样的, I2S的采样频率一般为44.1KHZ和48KHZ做,PCM采样频 ...