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的更多相关文章

  1. 离散化+线段树 POJ 3277 City Horizon

    POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...

  2. 线段树 poj 1436

    题目大意:给出n条垂直于x轴的线段的数据y1,y2,x,求出有几个三条线段一组的三元组并且他们兩兩能相见的.思路:对y轴建树,将x排序,然后按顺序边询问边擦入,用mark[i][j]表示j往左可以看到 ...

  3. [RMQ] [线段树] POJ 3368 Frequent Values

    一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...

  4. 线段树 poj 3468

    Description You have N integers, A1, A2, ... ,AN. You need to deal with two kinds of operations. One ...

  5. 线段树 poj 2991

    我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...

  6. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  7. poj 3667 Hotel (线段树)

    http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 94 ...

  8. POJ 3667 Hotel(线段树+区间合并)

    http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...

  9. POJ 3667 Hotel(线段树)

    POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...

随机推荐

  1. [DOM Event Learning] Section 4 事件分发和DOM事件流

    [DOM Event Learning] Section 4 事件分发和DOM事件流 事件分发机制: event dispatch mechanism. 事件流(event flow)描述了事件对象在 ...

  2. Android 更新UI的几种方式

    1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { ...

  3. NSError

    -(NSString * )backErrorString{ //    self.code; //http://blog.csdn.net/linkai5696/article/details/59 ...

  4. 软件工程--界面UI 的原型设计

    经过今天的讨论, 我们组初步给出了设计方案. 安装了一晚上的 mockupBuilder 终于绘制了几份界面的原型图, 这里需要吐槽下 mockupBuilder, 这个软件很好用, 不过网页版和单机 ...

  5. 2015 MVP OpenDay 及 Community Camp 演讲PPT分享

    这两天来到首都北京参加一年一度的MVP OpenDay 和 MVP Community Camp.其中,31号下午有我的课程:What Will You Make: Windows IoT应用开发入门 ...

  6. leveldb源码分析--SSTable之Compaction

    对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...

  7. MSDB数据库置疑的解决方法

    1.原因 机房停电,服务器非法关机,导致MSDB数据库被“置疑” 2.Msdb数据库的作用 Msdb 数据库供SQLServer 代理程序调度警报和作业以及记录操作员时使用.比如,我们备份了一个数据库 ...

  8. .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)

    阅读目录: 1.开篇介绍 2.NET并行计算基本介绍 3.并行循环使用模式 3.1并行For循环 3.2并行ForEach循环 3.3并行LINQ(PLINQ) 1]开篇介绍 最近这几天在捣鼓并行计算 ...

  9. postgres扩展开发

    扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...

  10. 搭建通过 ssh 访问的 Git 服务器

    一.Git 协议 Git 可以使用四种主要的协议来传输数据:本地传输,ssh 协议,Git 协议和 HTTP 协议. Git 使用的传输协议中最常见的就是 ssh 了.大多数环境已经支持通过 ssh ...