hdu2871 区间合并(类似poj3667)+vector应用
用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应用的更多相关文章
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- 区间合并 POJ3667+HDU4553
两道题都是线段树的区间合并 lsum, rsum分别表示左/右端点 开始向右/左 符合条件的元素的最长连续长度 sum表示这个区间的符合条件的元素的最长连续长度 所以pushUp可写: void pu ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- poj3667(线段树区间合并&区间查询)
题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- POJ 2750 Potted Flower (线段树区间合并)
开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并... 给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...
- ACM: Hotel 解题报告 - 线段树-区间合并
Hotel Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description The ...
随机推荐
- 1.2MyBatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上 ...
- Ajax 及里面的XStream《黑马程序员_超全面的JavaWeb视频教程vedio》
1. ajax是什么? * asynchronous javascript and xml:异步的js和xml * 它能使用js访问服务器,而且是异步访问! * 服务器给客户端的响应一般是整个页面,一 ...
- 集合-HashSet
参考博客:https://www.cnblogs.com/runwulingsheng/p/5208762.html https://www.cnblogs.com/ysocean/p/6555373 ...
- 20165337实验三——敏捷开发与XP实践
实验要求 实验三-1 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 参考 http://www.c ...
- git 上传代码
1.注册GitHub账号 2.在GitHub上建立github仓库 3.下载git 4.配置git 5.生成SSH密钥,并把密钥添加SSH密钥到GitHub上 6.创建本地仓库并上传代码到github ...
- Tesseract识别图片提取文字&字库训练
文中测试了3.0和4.0两个版本.发现3.0识别效率不准确,需要训练词库.4.0识别效率就比较高了,而且支持结果生成pdf.txt等格式.所以推荐使用4.0版本. 这个工具可以用在爬虫的时候获取验证码 ...
- 网络爬虫构造出URL的列表数据
urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number) for number in range(1,14)] # ...
- HDOJ 1166 敌兵布阵 (线段树)
题目: Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Ti ...
- 【转】python模块分析之unittest测试(五)
[转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...
- inception_v2版本《Rethinking the Inception Architecture for Computer Vision》(转载)
转载链接:https://www.jianshu.com/p/4e5b3e652639 Szegedy在2015年发表了论文Rethinking the Inception Architecture ...