题目大意:爱丽丝有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. Hadoop运行中遇到的错误调试

    在运行Hadoop的过程中遇到的最多的问题就是DataNode不能正常的启动,各种问题都有可能,说一下我遇到的两种情况: (1)第一种情况是Master的防火墙没有关闭.这样在启动Hadoop的时候, ...

  2. php随笔7-thinkphp OA系统 JS 文本框输入实时控制字数

    JS: //多行文本输入框剩余字数计算 function checkMaxInput(obj, maxLen) { if (obj == null || obj == undefined || obj ...

  3. nginx根据条件跳转+跳转规则

    好的参考博文: nginx rewrite规则 自己写的时候参考这两个 Nginx 伪静态Rewrite,重定向Location配置总结(转) nginx rewrite规则语法 一.输入子目录跳转 ...

  4. Python之路:迭代器和yield生成器

    一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代 ...

  5. Kettle之数据抽取、转换、装载

    Kettle 官网 ETL利器Kettle实战应用解析系列 利用kettle组件导入excel文件到数据库 kettle中实现动态SQL查询 java中调用kettle转换文件

  6. UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)

     Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simple in one or t ...

  7. 介绍一款开源的类Excel电子表格软件

     Excel一直以霸主的地位,占领了Windows桌面表格软件市场No 1,与此同一时候,Office套装产品差点儿成为了IT行业的标配办公技能.有无相似Excel的桌面程序,绿色版,实现主要的数 ...

  8. JavaScript 高级程序设计(第3版)笔记——chapter3:基本概念(函数部分)

    3.7函数 3.7.1 理解参数 ECMAScript 函数不介意传递进来多个参数,也不在乎传递进来的参数是什么数据类型.因为在 ECMAScript 中的参数在内部是用一个数组来表示的.在函数体内可 ...

  9. 【JQuery】eval()出现missing after property id 错误。

    是因为数据没有转换成json格式输出就直接eval了. 正确步骤:后台: JsonBinder.buildNormalBinder().toJson(list); 前台: eval('(${posit ...

  10. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...