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 ...
随机推荐
- Spring基础2
一.Spring属性注入 1)构造方法属性注入 2)set方法属性注入:通过在bean对象所属类中提供相应字段的set方法,并在配置文件中配置<property.....> <bea ...
- java 写 Excel(不生成实体文件,写为流的形式)
java 写 Excel(不生成实体文件,写为流的形式) public String exportReportExcel(String mediaCode, List<SimpleMediaRe ...
- TCC
严格遵守ACID的分布式事务我们称为刚性事务,而遵循BASE理论(基本可用:在故障出现时保证核心功能可用,软状态:允许中间状态出现,最终一致性:不要求分布式事务打成中时间点数据都是一致性的,但是保证达 ...
- AbstractQueuedSynchronizer的简单介绍
AbstractQueuedSynchronizer简称为AQS.大多数开发者不会直接使用AQS,标准同步器类的集合能够满足绝大多数情况的需求. 1.AbstractQueuedSynchronize ...
- Zookeeper学习笔记2
环境搭建 JDK(>1.6)安装 略 Zookeeper安装 1.下载 http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3. ...
- 【php】下载站系统Simple Down v5.5.1 xss跨站漏洞分析
author:zzzhhh 一. 跨站漏洞 利用方法1,直接在搜索框处搜索<script>alert(/xss/)</script>//',再次刷新,跨站语句将被 ...
- CentOS6源码安装VSFTPD3
还是碰到老问题:安全扫描,由于CentOS6上VSFTPD最高支持到V2.2.2,目前已经是官方支持的最新版本(发布了几年...) 但有安全漏洞,又没法通过限制访问进行控制,只能想办法升级到最新版本了 ...
- python3+selenium框架设计08-进一步实现POM
之前都是只有一个页面,一个用例.这次两个页面.两个测试用例.其实界面自动化测试最大的难点在于driver的传递,需要保持唯一性.另外就是断言的难点. 修改之前的BaiduPage,新增部分代码 fro ...
- C#实现邮件发送的功能
Ø 发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮 ...
- 027_nginx常见优化参数
一.nginx.conf主配置文件 proxy_ignore_client_abort on; #不允许代理端主动关闭连接