Hotel - poj 3667(求连续子区间)
题意:有两种操作
#include<algorithm>
#include<stdio.h>
using namespace std; #define lson r<<1
#define rson r<<1|1 const int MAXN = 1e5+; struct segmentTree
{///分别代表左边的最大连续区间,右边的最大连续区间,最大连续区间
int L, R, lsum, rsum, sum;
int op;///op等于 0 的时候不操作,等于 1 的时候房间占用,2 释放
int len(){return R-L+;}
int mid(){return (L+R)>>;}
}a[MAXN<<]; void pushDown(int r)
{
if(a[r].L != a[r].R && a[r].op)
{
a[lson].lsum = a[lson].rsum = a[lson].sum = (a[r].op == ? : a[lson].len());
a[rson].lsum = a[rson].rsum = a[rson].sum = (a[r].op == ? : a[rson].len()); a[lson].op = a[rson].op = a[r].op;
a[r].op = ;
}
}
void pushUp(int r)
{///一定要注意先把上层更新,才能进行合并操作
a[r].lsum = a[lson].lsum, a[r].rsum = a[rson].rsum; if(a[lson].lsum == a[lson].len())
a[r].lsum += a[rson].lsum;
if(a[rson].rsum == a[rson].len())
a[r].rsum += a[lson].rsum; a[r].sum = max(a[lson].sum, max(a[rson].sum, a[lson].rsum+a[rson].lsum));
}
void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R, a[r].op = ;
a[r].lsum = a[r].rsum = a[r].sum = a[r].len(); if(L == R)return ; Build(lson, L, a[r].mid());
Build(rson, a[r].mid()+, R);
}
void upDate(int r, int L, int R, int op)
{
if(a[r].L==L && a[r].R==R)
{///等于1房间完全被占用,那么剩余就是0,否则全部释放
a[r].lsum=a[r].rsum=a[r].sum = (op==? : a[r].len());
a[r].op = op; return ;
}
pushDown(r); if(R <= a[r].mid())
upDate(lson, L, R, op);
else if(L > a[r].mid())
upDate(rson, L, R, op);
else
{
upDate(lson, L, a[r].mid(), op);
upDate(rson, a[r].mid()+, R, op);
} pushUp(r);///向上更新父节点,只有下层改变值得时候需要这个操作
}
int Query(int r, int e)
{///判断原则,从左往右,找到最靠左的能够放下e的连续区间 pushDown(r); if( a[r].lsum >= e)return a[r].L;///判断最前面是否足够
if( a[lson].sum >= e )return Query(lson, e);///左子树够的话去左子树
if( a[lson].rsum +a[rson].lsum >= e )///判断中间是否足够
return a[lson].R - a[lson].rsum + ;
return Query(rson, e);///只能去右子树
} int main()
{
int N, M, L, R, op; while(scanf("%d%d", &N, &M) != EOF)
{
Build(, , N); while(M--)
{
scanf("%d", &op); if(op == )
{
scanf("%d", &R); if(R > a[].sum)///没有能放下的连续区间
printf("0\n");
else
{ L = Query(, R);
R = L+R-;///求出来右端
printf("%d\n", L);
upDate(, L, R, );
}
}
else
{
scanf("%d%d", &L, &R);
upDate(, L, L+R-, );
}
}
} return ; }
Hotel - poj 3667(求连续子区间)的更多相关文章
- Tunnel Warfare--- hdu1540 线段树求连续子区间
题目链接 题意:有n个村庄,编号分别为1-n:由于战争会破坏村庄,但是我们也会修复: D x代表村庄x被破坏: Q x是求与x相连的有几个没有被破坏: R 是修复最后一次被破坏的村庄: 接下来有m个操 ...
- Hotel poj 3667
Language: Default Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18020 Acc ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- POJ 3667 Hotel(线段树)
POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...
- POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- Poj 3667
这是第一题线段树的区间合并的题: 这类的题用于求连续的最长长度什么的: 这题我看的是一篇比较不错的博客: 我把我的理解注释在代码里了: #include <iostream>#includ ...
- 求连续数字的和------------------------------用while的算法思想
前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...
- 求连续出现5次以上的值,并且取第5次所在id
关键字:求连续出现5次以上的值,并且取第5次所在id 关键字:求在某列连续出现N次值的的数据,并且取第M次出现所在行 需求,求连续出现5次以上的值,并且取第5次所在id SQL SERVER: --测 ...
随机推荐
- 关于xml作为模板的配置服务系统开发
最近在做一个后台配置系统,其实之前也接触过,所谓的配置系统就是指,将你的网站布局抽象成一个xml模板,里面包括你自定义的节点,然后将变化的部分作为配置项,通过服务将配置选项与模板组装成一个js(这个服 ...
- json 序列化和反序列化
Json串的格式: string strDataDiyList={"id":"1","name":"zhangsan", ...
- 初定为EGame
[Q]在纠结到底要用什么方式写博客,是原生态记录框架编写过程(有点所谓的手把手教学的感觉有木有),还是每个模块整合完毕后写分析文章,新手没有写过博客,不知道那种效果好.朋友们给点建议? 这套框架的初衷 ...
- android - 模拟器连接本地tomcat
在使用android真机试图连接本地的tomcat的时候,发现一直没有反应.网上搜了很多资料,加上自己不断测试,后来发现模拟器访问tomcat的时候,ip的概念跟在pc上访问tomcat用的ip,根本 ...
- Set Linux starts in multi-user mode as default.
ref: How to start Linux in multiuser mode rather than boot directly into XWindows (X11) steps: Log i ...
- Oracle_Flashback_技术_总结
Oracle Flashback 技术 总结 Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数.要使用flashback 的特性,必须启 ...
- cer, pfx 创建,并且读取公钥/密钥,加解密 (C#程序实现)
PKI技术(public key infrastructure)里面,cer文件和pfx文件是很常见的.通常cer文件里面保存着公钥以及用户的一些信息,pfx里面则含有私钥和公钥. 用makecert ...
- WPF 依赖属性与依赖对象
在介绍依赖属性之前,我先介绍下属性的历史 属性的历史: 早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中 ...
- 你好,C++(10)这次的C++考试你过了没有?C++中表示逻辑判断的布尔数据类型
3.4 布尔类型 在日常生活中,我们除了需要使用int类型的变量表示216路公交车:需要使用float类型的变量表示西红柿3.5元一斤,有时候还需要表示一种数据,那就是逻辑状态: “这次的C++考试 ...
- 关于overflow:hidden和bfc
在练习tab选项卡的时候遇到了设置div内部li出现了影响外层相邻div浮动的情况,早就知道overflow:hidden可以清除这种情况产生的浮动,但是为什么它可以清除呢?我们往下看: 首先看一下我 ...