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 ...
随机推荐
- C#获取客户端IP地址
客户端ip:Request.ServerVariables.Get("Remote_Addr").ToString();客户端主机名:Request.ServerVariables ...
- 《jQuery精品教程视频》-每天的复习笔记
第一天 //jquery:简单.粗暴 //jq和js的关系 //js是什么? js是一门编程语言 //jq仅仅是基于js的一个库,jq可理解为就是开发js的一个工具. //概念 //1. 为什么要学j ...
- JAVA配置文件/反射操作
配置文件 1. 在src目录下新建一个file, 命名为XXX.properties 2.编写配置文件: 3. import java.util.ResourceBundle; 4. 使用如下代码读取 ...
- 2017-2018-2 20165234 实验四《Android程序设计》实验报告
一.实验报告封面 课程:Java程序设计 班级:1652 姓名:刘津甫 学号:20165234 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:13:45 - 3:25 ...
- C&C++动态分配内存(手动分配内存)三种方式
1. malloc函数 函数原型:void *malloc(unsigned int size)函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...
- TextView 文字拼接
//引用文字 String testStr = (getResources().getString(R.string.test_str,"<font color='#ff0000'&g ...
- 配置Oracle GoldenGate安全性
本章介绍如何配置Oracle GoldenGate安全性. 本章包括以下部分: Overview of Oracle GoldenGate Security Options Encrypting Da ...
- backgroud-size属性
backgroud-size:100% 改为:backgroud-size:100% 100%; 就能解决下面的问题.
- Linux Makefile 生成 *.d 依赖文件及 gcc -M -MF -MP 等相关选项说明【转】
转自:https://blog.csdn.net/qq1452008/article/details/50855810 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...
- python3+selenium框架设计07-unittest单元测试框架
可以自行百度学习下单元测试框架,或者看Python3学习笔记26-unittest模块 在项目下新建一个entrance.py文件.并使用之前的测试用例进行演示.目前项目结构. 在entrance ...