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 ...
随机推荐
- window.name
name 设置或返回存放窗口的名称的字符串.该名称是在 open()方法创建窗口时指定的或者使用一个<frame>标记的name属性指定的. 窗口的名称可用作一个<a>或者&l ...
- 【转载】java abstract class和interface的区别
转载:https://blog.csdn.net/b271737818/article/details/3950245 在Java语言中,abstract class和interface是支持抽象类定 ...
- javascript面试--网络收集
史上最全的Javascript面试题总结(内附答案) - CSDN博客http://blog.csdn.net/u011277123/article/details/70208768 6.什么是未声明 ...
- eclipse中一些常见svn图标的含义
项目视图 The Package Explorer view - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽 ...
- Struts2 REST 插件 XStream 远程代码执行漏洞 S2-052 复现过程
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- linux系统内核版本升级
一.查看Linux内核版本命令(2种方法): 1.cat /proc/version 2.uname -a 二.查看Linux系统版本的命令(3种方法): 1.lsb_release -a 即可列出所 ...
- CF1100D Dasha and Chess
题目地址:CF1100D Dasha and Chess 这是我的第一道交互题 思路不难,主要讲讲这条语句: fflush(stdout); stdout是标准输出的意思.因为有时候,我们输出到std ...
- CVE-2019-0797漏洞:Windows操作系统中的新零日在攻击中被利用
https://securelist.com/cve-2019-0797-zero-day-vulnerability/89885/ 前言 在2019年2月,卡巴实验室的自动漏洞防护(AEP)系统检测 ...
- 案例一(haproxy+keepalived高可用负载均衡系统)【转】
1.搭建环境描述: 操作系统: [root@HA-1 ~]# cat /etc/redhat-release CentOS release 6.7 (Final) 地址规划: 主机名 IP地址 集群角 ...
- web-font 个人学习小总结
个人觉得 web-font 分为两种: 第一种就是真正文本字体,客户端没有安装的字体通过远程加载字体来实现特殊字体提高用户体验: icodon.com : http://icodon.com/goo ...