线段树 poj 3667
1-n线段 m个操作
1 a
是否可找到连续a个空位子 有输出最左边(然后使这一段被占)没有0
2 a ,b
a~b区间变成未使用
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; #define MAXN 50010 struct node
{
int l,r,lsum,rsum,msum,la;
}x[MAXN<<];
void Build(int l,int r,int a)
{
x[a].l=l;
x[a].r=r;
x[a].lsum=x[a].rsum=x[a].msum=r-l+;
x[a].la=-;
if(l==r)
return ;
int mid=(l+r)>>;
Build(l,mid,a<<);
Build(mid+,r,a<<|);
}
void push_down(int a)
{
int ll=x[a<<].r-x[a<<].l+;
int rr=x[a<<|].r-x[a<<|].l+;
x[a<<].la=x[a<<|].la=x[a].la;
x[a<<].rsum=x[a<<].lsum=x[a<<].msum=x[a].la?:ll;
x[a<<|].rsum=x[a<<|].lsum=x[a<<|].msum=x[a].la?:rr;
x[a].la=-;
}
void push_up(int a)
{
int ll=x[a<<].r-x[a<<].l+;
int rr=x[a<<|].r-x[a<<|].l+;
x[a].lsum=x[a<<].lsum;
if(x[a].lsum==ll)//区间合并
x[a].lsum+=x[a<<|].lsum;
x[a].rsum=x[a<<|].rsum;
if(x[a].rsum==rr)
x[a].rsum+=x[a<<].rsum;
x[a].msum=max(max(x[a<<].msum,x[a<<|].msum),x[a<<].rsum+x[a<<|].lsum);
} void update(int l,int r,int a1,int b1,int w,int a)
{
if(a1<=l&&r<=b1)
{
x[a].lsum=x[a].rsum=x[a].msum=w?:(r-l+);
x[a].la=w;
return ;
}
int mid=(l+r)>>;
if(x[a].la!=-)
push_down(a);
if(a1<=mid)
update(l,mid,a1,b1,w,a<<);
if(b1>mid)
update(mid+,r,a1,b1,w,a<<|);
push_up(a);
}
int Ques(int l,int r,int w,int a)
{
if(l==r)
return l;
if(x[a].la!=-)
push_down(a);
int mid=(l+r)>>;
if(x[a<<].msum>=w)//左孩子最大连续区间够了
return Ques(l,mid,w,a<<);
else if(x[a<<].rsum+x[a<<|].lsum>=w)//中间连续够了
return mid-x[a<<].rsum+;
return Ques(mid+,r,w,a<<|); //右边
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
Build(,n,);
while(m--)
{
int op,a,b;
scanf("%d",&op);
if(op==)
{
scanf("%d",&a);
if(x[].msum<a)//最大的
printf("0\n");
else
{
int p=Ques(,n,a,);
printf("%d\n",p);
update(,n,p,p+a-,,);//变成使用
}
}
else
{
scanf("%d%d",&a,&b);
update(,n,a,a+b-,,);//变成未使用
}
}
return ;
}
线段树 poj 3667的更多相关文章
- 离散化+线段树 POJ 3277 City Horizon
POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...
- 线段树 poj 1436
题目大意:给出n条垂直于x轴的线段的数据y1,y2,x,求出有几个三条线段一组的三元组并且他们兩兩能相见的.思路:对y轴建树,将x排序,然后按顺序边询问边擦入,用mark[i][j]表示j往左可以看到 ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
- 线段树 poj 3468
Description You have N integers, A1, A2, ... ,AN. You need to deal with two kinds of operations. One ...
- 线段树 poj 2991
我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- poj 3667 Hotel (线段树)
http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 94 ...
- POJ 3667 Hotel(线段树+区间合并)
http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...
- POJ 3667 Hotel(线段树)
POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...
随机推荐
- iOS之There was an internal API error错误
There was an internal API error. 错误原因:把Product Name作为程序名称,程序名称错乱 解决方法:检查Product Name, 不要包含中文以及特殊字符.在 ...
- C#中的泛型
写在前面:好几个月没更新了,这些天换了份工作,原来的公司出了很多事所以辞职了.这篇文章写的超级好,让我终于明白了困扰在我心里好久的C#泛型的概念,不仅收藏了,还手动转发一下 哈哈哈~ 1.1 C#中的 ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- iOS 常用三方类库整理
iOS 常用三方类库整理 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://gi ...
- iOS开发之XCode设置--消除AFN的警告
本篇是直接拷贝别人的博文,地址:http://blog.csdn.net/liyiyismile/article/details/50434844 在项目开发中导入第三方sdk后会提示很多这样的错误: ...
- mac osx get postgresql path
sudo lsof -i :5433 ps xuwww -p 91 sudo port install py27-psycopg2
- js判断鼠标是否停止移动
本程序实现当鼠标在一个特定的div内悬停n秒时,判断出已经停止移动. 思路: 1.定义全局变量鼠标移动状态imouse,定时器timer.当鼠标在div内移动时,imouse值为1,相反静止时值为0: ...
- 编写Javascript类库(jQuery版) - 进阶者系列 - 学习者系列文章
这些年主要关注于项目管理方面的工作,编码就比较少了.这几天比较空闲,就想把原来的经验沉淀下来,一个是做好记录,以后如果忘记了还能尽快找回来,第二个是写写博文,算是练练手笔吧. 言归正传,这次写的是Ja ...
- Linux命令学习总结:pwd命令
命令简介: 该命令用来显示目前所在的工作目录.指令英文原义:print work directory 执行权限 :All User 指令所在路径:/usr/bin/pwd 或 /bin/pwd ...
- truncate 、delete与drop区别
原博文地址:http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html 相同点: 1.truncate和不带where子句的delete. ...