线段树 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 ...
随机推荐
- Android 学习心得 页面跳转,不显示新页面信息
原因: 1.新页面的Activity中,public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- Android--split()分割字符串特殊用法
split()分割字符串 1.不同环境下的区分 Java:分割字符串不能写成split("$")//$为要分割的字符Android:分割字符串需要加上中括号split(" ...
- iOS多线程实现4-NSOperation
原文链接:http://www.cnblogs.com/mddblog/p/4816875.html 一.介绍 NSOperation是一个抽象类,我们可以使用系统提供的子类或者自己实现它的子类,具有 ...
- 学习Maven之Cobertura Maven Plugin
cobertura-maven-plugin是个什么鬼? cobertura-maven-plugin是一个校验单元测试用例覆盖率的工具,可以生成一个测试覆盖率报告,可以给单元测试用例编写提供参考. ...
- TNS-12502: TNS:listener received no CONNECT_DATA from client
检查我们的一台ORACLE数据库的监听日志发现有不少TNS-12502错误信息.如下所示 TNS-12502: TNS:listener received no CONNECT_DATA from c ...
- SQL Server删除distribution数据库
在数据库服务器删除复制(发布订阅)后,如何删除掉数据库distribution呢?如果你通过SSMS工具去删除数据库distribution,你会发现根本没有删除选项. 下面介绍一下删除distrib ...
- mysql 单表排序,相同值排序
两种方式: 第一种是利用笛卡尔积,两对比排序 -- 学校类型数据 SELECT t.examid,'-' AS unitcode,t.schooltype,'-' AS classname,t.bkr ...
- MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事
回到目录 关于官方驱动集成IQueryable之后的一些事,有好事也有坏事,好事就是它会将你的linq语句非常友好的翻译成MongoDB语句,而坏事就是有一些linq语句不会被翻译,不会被翻译的代价就 ...
- Tomcat开机自启动
需要Tomcat开机自动启动应用: 首先.配置Java环境变量: 然后.新建变量:CATALINA_HOME=你的TOMCAT的根目录 最后.在PATH变量最后加上: ;%CATALINA_HOME% ...
- [原创]基于rsync算法的目的性改进-RexSync
rsync是一种文件差异传输的算法,特点是高效且相似块识别率较高.具体算法这边就不赘述,网上很多,官方文档也描述的很清楚. rsync提高文件比对效率的一个核心算法之一就是rolling checks ...