分块,记录每个块内包括左端点的最大连续白段的长度,

整个块内的最大连续白段的长度,

和包括右端点的最大连续白段的长度。

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

  1. bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 758  Solved: 419[Submit ...

  2. 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

    题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...

  3. 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆

    最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...

  4. BZOJ1593 [Usaco2008 Feb]Hotel 旅馆

    裸上线段树,就是记的东西有点多... 每个点记区间左端最长0,右端最长0,中间最长0,和tag表示是否全为0/1 直接更新就好,查询的时候先查左儿子,然后查中间,最后查右儿子... /******** ...

  5. 1593: [Usaco2008 Feb]Hotel 旅馆

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 391  Solved: 228[Submit ...

  6. 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并

    题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...

  7. BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆

    Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 &l ...

  8. BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]

    传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...

  9. 【BZOJ】1593: [Usaco2008 Feb]Hotel 旅馆

    [算法]线段树(经典线段树上二分) [题意]n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号. [题解]关键在于找连续x个空房间,经典二分. 线段树标记s ...

随机推荐

  1. 面试前需要弄懂的SQL

    说明:创建数据库 view source   print? 1 Create DATABASE database-name 说明:删除数据库 view source   print? 1 drop d ...

  2. 如何用Ajax传一个数组数据

    PHP接收多个同名复选框信息不像ASP那样自动转换成为数组,这给使用带来了一定不便.但是还是有解决办法的,就是利用javascript做一下预处 理.多个同名复选框在javascript中还是以数组的 ...

  3. Error in deleting blocks.

    2014-08-24 22:15:21,714 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Error processing datan ...

  4. php getimagesize()函数获取图片宽度高度

    //php自带函数 getimagesize() $img_info = getimagesize('tomener.jpg'); echo '<pre>'; print_r($img_i ...

  5. php连接mysql报错——Fatal error: Call to undefined function mysql_connect() in

    练习php连接mysql数据库 代码:mysql_connect("127.0.0.1:3306","root", ..... 浏览器报错:Fatal erro ...

  6. 【bzoj4310/hdu5030-跳蚤】后缀数组

    我真的是..调了一百年.. 傻逼的人生.. 而且这题好像可以用sam做哎!我Y出了一个奇怪的办法.. 好吧sam是不能做这题的.搞错了. 说说后缀数组好了.. 搞后缀数组 然后我们要二分一个子串,判断 ...

  7. LCD实验学习笔记(一):Makefile

    主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o seri ...

  8. 在生成的Debug中test.exe的同级目录下创建一个文件,如TestLog.log

    在上次编写一个日志类库时,想在.exe的同级目录下创建.log文件,对于这个路径的获得很简单,调用GetModuleFileName()函数即可.但是要去掉.exe而换成.log时,由于对字符串处理不 ...

  9. locust===注意事项

    1.安装包在:微盘 2.运行命令是:locust -f load_test.py --host=https://www.baidu.com 3.本地打开的是:http://localhost:8089 ...

  10. Quorum一致性协议

    Quorum一致性协议 一个分布式数据库系统中通常是一系列密切关联的操作组成完整的系统. 分布式系统最基本的要保证一致性, 分区性通常是无法避免的, 在这种情况下尽力通过软件协议做到最大可用性. 根据 ...