【分块】bzoj1593 [Usaco2008 Feb]Hotel 旅馆
分块,记录每个块内包括左端点的最大连续白段的长度,
整个块内的最大连续白段的长度,
和包括右端点的最大连续白段的长度。
Because 是区间染色,所以要打标记。
至于怎样在O(sqrt(n))的时间内找到最左的白色段呢?非常恶心…… 要考虑跨块的白段和块内的白段,并且顺序不能反。(代码中YuDing()函数)
这题完全体现不出分块编程复杂度低的优势,完全逊色于线段树。
So 综上,对于要进行复杂的成段修改的题目,分块的编程复杂度较高,几乎没有优势,不推荐写。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int len[],lenl[],lenr[],n,m,l[],r[],num[],sum,sz,x,y;
bool a[];
int delta[],op;
int Res,Num;char C,CH[];
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
inline void P(long long x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
void makeblock()
{
memset(delta,-,sizeof(delta));
sz=sqrt(n);
for(sum=;sum*sz<n;sum++)
{
l[sum]=(sum-)*sz+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
len[sum]=lenl[sum]=lenr[sum]=sz;
}
l[sum]=sz*(sum-)+; r[sum]=n;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
len[sum]=lenl[sum]=lenr[sum]=r[sum]-l[sum]+;
}
inline void Pushdown(const int &p)
{
if(delta[p]!=-)
{for(int i=l[p];i<=r[p];i++) a[i]=delta[p];
delta[p]=-;}
}
inline void Work(const int &Lb,const int &Rb,const int &sym)
{
Pushdown(num[Lb]);
for(int i=Lb;i<=Rb;i++) a[i]=sym;
int cnt=;
for(int i=l[num[Lb]];i<=r[num[Lb]];i++) {if(a[i]) break; cnt++;}
lenl[num[Lb]]=cnt; cnt=;
for(int i=r[num[Lb]];i>=l[num[Lb]];i--) {if(a[i]) break; cnt++;}
lenr[num[Lb]]=cnt; cnt=;
int Longest=;
for(int i=l[num[Lb]];i<=r[num[Lb]];i++)
{
if(a[i]) cnt=; else cnt++;
if(cnt>Longest) Longest=cnt;
}
len[num[Lb]]=Longest;
}
inline void Update(const int &L,const int &R,const bool &sym)
{
if(num[L]==num[R]) Work(L,R,sym);
else
{
Work(L,r[num[L]],sym);
Work(l[num[R]],R,sym);
for(int i=num[L]+;i<num[R];i++)
{
delta[i]=sym;
len[i]=lenl[i]=lenr[i]=sym ? : r[i]-l[i]+;
}
}
}
inline void YuDing()
{
int kua=,kuasta;
for(int i=;i<=sum;i++)
{
if(kua) kua+=lenl[i];
if(kua>=x)//预定sta~sta+x-1
{
Update(kuasta,kuasta+x-,true);
P(kuasta);
return;
}
if(len[i]!=r[i]-l[i]+) kua=;
if(!kua&&lenr[i])
{
kua=lenr[i];
kuasta=r[i]-lenr[i]+;
}
if(len[i]>=x)
{
Pushdown(i);
int cnt=,Nowleft;
for(int j=l[i];j<=r[i];j++)
{
if(a[j]) cnt=; else cnt++;
if(cnt==) Nowleft=j;
if(cnt==x)
{
Update(Nowleft,Nowleft+x-,true);
P(Nowleft);
return;
}
}
}
}
puts("");
}
int main()
{
n=G();m=G();
makeblock();
for(int i=;i<=m;i++)
{
op=G();x=G();
if(op==) YuDing();
else {y=G(); Update(x,x+y-,false);}
}
return ;
}
【分块】bzoj1593 [Usaco2008 Feb]Hotel 旅馆的更多相关文章
- bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 758 Solved: 419[Submit ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
- 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆
最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...
- BZOJ1593 [Usaco2008 Feb]Hotel 旅馆
裸上线段树,就是记的东西有点多... 每个点记区间左端最长0,右端最长0,中间最长0,和tag表示是否全为0/1 直接更新就好,查询的时候先查左儿子,然后查中间,最后查右儿子... /******** ...
- 1593: [Usaco2008 Feb]Hotel 旅馆
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 391 Solved: 228[Submit ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆
Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 &l ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]
传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...
- 【BZOJ】1593: [Usaco2008 Feb]Hotel 旅馆
[算法]线段树(经典线段树上二分) [题意]n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号. [题解]关键在于找连续x个空房间,经典二分. 线段树标记s ...
随机推荐
- 解决es6中webstrom不支持import的一个简单方法
代码如下: export_one.js的代码如下: export function one() { console.log('one'); } export function two() { cons ...
- python 一些乱七八糟的东西
import random import os import sys import re class _is: def __init__(self,reg): self.cr=re.compile(r ...
- WebOS系列-了解Wekbit【邓侃】
注:[转载请注明文章来源.保持原样] 出处:http://www.cnblogs.com/jyli/archive/2010/02/02/1660634.html 作者:李嘉昱 这是Kan老大的We ...
- vue与node模版引擎的渲染标记{{}}(双花括号)冲突
由于之前练习koa2,直接渲染的jquery写的传统页面. 这次想偷懒,直接script引入vue,发现渲染不出data值. 渲染引擎用得是xtpl, 找了半天没有发现可以修改xtpl渲染分隔符的配置 ...
- java使用JNA调用dll
1.自己搞一个dll出来.参考下面链接 http://blog.csdn.net/lqena/article/details/46357165. 2.下载jar jna-4.2.1.jar. 3.复制 ...
- bzoj3779: 重组病毒 link-cut-tree
题目传送门 这道题看了做了个神转换.....推荐个博客给各位大爷看看吧神犇传送门 代码敲了半天....题目也读了半天 线段树维护的东西很容易和lct混在一起 调了调能过也是很开心啊 运气比较好吧233 ...
- LeetCode 192:Reverse Bits
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- 【反演复习计划】【bzoj3529】数表
Orz PoPoQQQ大爷 按照他ppt的解法,这题可以划归到之前的题了OrzOrz 跪wy写的题解(Stealth Assassin)https://www.luogu.org/wiki/show? ...
- 在oracle官网上,找到我们所需版本的jdk
oracle的官网,因为都是英文,而且内容还特别多,经常的找不到历史版本的JDK. 特地,将找历史版本JDK的方法记录下来. 访问:http://www.oracle.com/technetwork/ ...
- Max-heap && Min-heap && push_heap
最大堆:make_heap(vi.begin(),vi.end()) #include <iostream> #include <vector> #include <al ...