题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花。然后又如下两个操作。

1:A B    从第A个花瓶开始,往后依次插B朵花,直到不能插为止。如果一朵花都不能插入就输出“can.....”,否则输出第一个插花位置和最后一个插花位置。

2:A B    输出A B 之间有多少朵花   然后将这些花瓶清空。

当时比赛的时候始终找不到办法求出 最后一个插花位置。  也想过二分  但是想着怕效率太慢就没写。

其实最后想想也是 只有50000个操作   再乘以log N的二分  最多也就20W左右吧。

我是弱菜,自己写的程序效率巨慢。而且数组也开得多。

思路:

用lef 记录每个区间最左边可以放的花瓶,如果没有就是INF

用rig 记录每个区间最右边可以放的花瓶,如果没有就是-1

以上两个在更新的时候  lef选较小的   rig选较大的

cov表示区间全空 0 还是全满1  ,或者是不空不满  -1

然后emp表示区间空花瓶数。

主要的难点就是可以插花的时候怎么找到最后一个插花位置。

那么就用二分  找那个 emp ==  所需要插花的数量 的最小右边的区间。

详见代码。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#define maxn 50005
#define lson num<<1,s,mid
#define rson num<<1|1,mid+1,e
#define INF 0x3f3f3f3f
using namespace std; int emp[maxn<<2];
int cov[maxn<<2];
int lef[maxn<<2];
int lzy[maxn<<2];
int rig[maxn<<2]; void pushup(int num)
{
emp[num]=emp[num<<1]+emp[num<<1|1]; if(cov[num<<1]==0 && cov[num<<1|1]==0)cov[num]==0;
else if(cov[num<<1|1]==1 && cov[num<<1]==1)cov[num]=1;
else cov[num]=-1;
lef[num]=min(lef[num<<1],lef[num<<1|1]);
rig[num]=max(rig[num<<1|1],rig[num<<1]);
} void pushdown(int num,int s,int e)
{
if(lzy[num]!=0)
{
int mid=(s+e)>>1; lzy[num<<1]=lzy[num<<1|1]=lzy[num]; if(cov[num]!=-1)cov[num<<1]=cov[num<<1|1]=cov[num]; if(cov[num<<1]==0)emp[num<<1]=mid-s+1;
else if(cov[num<<1]==1)emp[num<<1]=0; if(cov[num<<1|1]==0)emp[num<<1|1]=e-mid;
else if(cov[num<<1|1]==1)emp[num<<1|1]=0; if(cov[num]==0)
{
lef[num<<1]=s;
rig[num<<1]=mid;
lef[num<<1|1]=mid+1;
rig[num<<1|1]=e;
}
else
{
lef[num<<1]=lef[num<<1|1]=INF;
rig[num<<1]=rig[num<<1|1]=-1;
}
lzy[num]=0;
}
} void build(int num,int s,int e)
{
cov[num]=0;
lef[num]=s;
rig[num]=e;
emp[num]=e-s+1;
lzy[num]=0;
if(s==e)return;
int mid=(s+e)>>1; build(lson);
build(rson);
pushup(num);
} void update(int num,int s,int e,int l,int r,int val)
{
if(l<=s && r>=e)
{
lzy[num]=1;
cov[num]=val;
emp[num]=val==0?e-s+1:0;
lef[num]=val==0?s:INF;
rig[num]=val==0?e:-1;
return;
}
pushdown(num,s,e);
int mid=(s+e)>>1;
if(l<=mid)update(lson,l,r,val);
if(r>mid)update(rson,l,r,val);
pushup(num);
} int query(int num,int s,int e,int l,int r)
{
//printf("emp=%d,s=%d,e=%d,l=%d,r=%d,cov=%d\n",emp[num],s,e,l,r,cov[num]);
if(l<=s && r>=e)
{
return emp[num];
}
pushdown(num,s,e);
int mid=(s+e)>>1;
if(r<=mid)return query(lson,l,r);
else if(l>mid)return query(rson,l,r);
else return query(lson,l,mid)+query(rson,mid+1,r);
pushup(num);
} int Q_L(int num,int s,int e,int l,int r)//找到区间的LEF
{
if(l==s && r==e)
{
return lef[num];
} pushdown(num,s,e);
int mid=(s+e)>>1;
if(r<=mid)return Q_L(lson,l,r);
else if(l>mid)return Q_L(rson,l,r);
else return min(Q_L(lson,l,mid),Q_L(rson,mid+1,r));
pushup(num);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m); build(1,1,n);//额额额。 我是用1-N 建的树 而题目说的是 0-N-1 所以。。。后面有一些++操作。。。
int tl,tr;
while(m--)
{
int op,aa,bb;
scanf("%d%d%d",&op,&aa,&bb); if(op==1)
{
aa++;
int ll=Q_L(1,1,n,aa,n);//找到左边
if(ll==INF)
{
printf("Can not put any one.\n");
continue;
}
printf("%d ",ll-1);
int ttmp=query(1,1,n,ll,n); if(ttmp==0)
printf("Can not put any one.\n");
else
{
if(ttmp<=bb)
{
printf("%d\n",rig[1]-1);
update(1,1,n,ll,n,1);
}
else
{
int top=n,bot=ll,mid;
while(bot<=top)
{
mid=(bot+top)>>1;
int bin=query(1,1,n,ll,mid);
if(bin>bb)
top=mid-1;
else if(bin<bb)
bot=mid+1;
else break;
}
while(query(1,1,n,ll,mid)==bb)//找到最小的
{
mid--;
if(mid<=ll)break;
}
printf("%d\n",mid+1-1);
update(1,1,n,ll,mid+1,1);
}
}
}
else
{
aa++,bb++;
printf("%d\n",bb-aa+1-query(1,1,n,aa,bb));
update(1,1,n,aa,bb,0);
}
}
puts("");
}
return 0;
}

hdu 4614 Vases and Flowers (二分 线段树)的更多相关文章

  1. HDU 4614 Vases and Flowers(二分+线段树区间查询修改)

    描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...

  2. HDU 4614 Vases and Flowers(线段树+二分)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  3. HDU 4614 Vases and Flowers 【线段树】+【二分】

    <题目链接> 题目大意: 有n个花瓶,每个花瓶中只能放一朵花.两种操作,一种是从A开始放F朵花,如果有的花瓶中已经有花则跳过这个花瓶,往下一个花瓶放:第二种是将区间[A,B]之间花瓶中的花 ...

  4. HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...

  5. hdu 4614 Vases and Flowers(线段树:成段更新)

    线段树裸题.自己写复杂了,准确说是没想清楚就敲了. 先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了. 重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新 ...

  6. hdu 4614 Vases and Flowers(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...

  7. HDU4614 Vases and Flowers 二分+线段树

    分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...

  8. HDU - 4614 Vases and Flowers(二分+区间修改)

    https://cn.vjudge.net/problem/HDU-4614 题意 n个花瓶,m个操作,花瓶里面有的有花,有的是空的.1操作是从a开始往右放b朵花,花瓶有了的不放,跳过,直到a右边都放 ...

  9. HDU 4614 Vases and Flowers (2013多校2 1004 线段树)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  10. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

随机推荐

  1. 总线接口与计算机通信(四)USB外部总线(初级认识)

    USB简介   USB是英文Universal Serial BUS(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术.USB接口支持设备的即插 ...

  2. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  3. HTML解决div里面img的缝隙问题

    图片IMG与容器下边界之间有空隙怎么办?这里介绍3中简单的解决方法. 第一,给图片img标签display:block. img{display:block} 第二,定义容器里的字体大小为0. div ...

  4. (IOS)国际本地化设置

    首先New File,在Resource中选择Strings File: 然后命名该strings文件,必须命名为 Localizable : 再者选中该strings文件,在Localization ...

  5. JS 移动动画

    function moveElement(elementId, final_x, final_y,interval) {            if (!document.getElementById ...

  6. 戴尔CEO:我们将专注于企业 而非手机业务

    9月13日消息,据国外媒体报道,戴尔公司董事长兼首席执行官迈克尔·戴尔(Michael Dell)周五接受了CNBC采访,谈了他对戴尔未来的打算.此前一天,迈克尔·戴尔提出的以250亿美元将戴尔私有化 ...

  7. zzuli生化危机(dfs)

    生化危机 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 73  Solved: 21SubmitStatusWeb Board Description ...

  8. 一行JavaScript代码获取页面中的所有超链接地址

    因为我喜欢收集Web开发类的网址,平时对网址就很敏感. 我总结了一下我收集网址的几个阶段: 1.纯手工阶段,傻傻的阶段. 在这个阶段,主要是收集一些在页面中展现出来的网址,就是说,如果网址出现在HTM ...

  9. CSS的三种样式:内联式,嵌入式,外部式以及他们的优先级

    从CSS 样式代码插入的形式来看基本能够分为下面3种:内联式.嵌入式和外部式三种. 1:内联式css样式表就是把css代码直接写在现有的HTML标签中,如以下代码: <p style=" ...

  10. SpringMVC+Mybatis+Mysql实战项目学习--环境搭建

    1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...