hdu 4614 Vases and Flowers (二分 线段树)
题目大意:爱丽丝有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 (二分 线段树)的更多相关文章
- HDU 4614 Vases and Flowers(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
- HDU 4614 Vases and Flowers(线段树+二分)
Vases and Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- HDU 4614 Vases and Flowers 【线段树】+【二分】
<题目链接> 题目大意: 有n个花瓶,每个花瓶中只能放一朵花.两种操作,一种是从A开始放F朵花,如果有的花瓶中已经有花则跳过这个花瓶,往下一个花瓶放:第二种是将区间[A,B]之间花瓶中的花 ...
- HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...
- hdu 4614 Vases and Flowers(线段树:成段更新)
线段树裸题.自己写复杂了,准确说是没想清楚就敲了. 先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了. 重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新 ...
- hdu 4614 Vases and Flowers(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- HDU4614 Vases and Flowers 二分+线段树
分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...
- HDU - 4614 Vases and Flowers(二分+区间修改)
https://cn.vjudge.net/problem/HDU-4614 题意 n个花瓶,m个操作,花瓶里面有的有花,有的是空的.1操作是从a开始往右放b朵花,花瓶有了的不放,跳过,直到a右边都放 ...
- 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 ...
- 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)
题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...
随机推荐
- Hadoop运行中遇到的错误调试
在运行Hadoop的过程中遇到的最多的问题就是DataNode不能正常的启动,各种问题都有可能,说一下我遇到的两种情况: (1)第一种情况是Master的防火墙没有关闭.这样在启动Hadoop的时候, ...
- php随笔7-thinkphp OA系统 JS 文本框输入实时控制字数
JS: //多行文本输入框剩余字数计算 function checkMaxInput(obj, maxLen) { if (obj == null || obj == undefined || obj ...
- nginx根据条件跳转+跳转规则
好的参考博文: nginx rewrite规则 自己写的时候参考这两个 Nginx 伪静态Rewrite,重定向Location配置总结(转) nginx rewrite规则语法 一.输入子目录跳转 ...
- Python之路:迭代器和yield生成器
一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代 ...
- Kettle之数据抽取、转换、装载
Kettle 官网 ETL利器Kettle实战应用解析系列 利用kettle组件导入excel文件到数据库 kettle中实现动态SQL查询 java中调用kettle转换文件
- UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
Stacking Boxes Background Some concepts in Mathematics and Computer Science are simple in one or t ...
- 介绍一款开源的类Excel电子表格软件
Excel一直以霸主的地位,占领了Windows桌面表格软件市场No 1,与此同一时候,Office套装产品差点儿成为了IT行业的标配办公技能.有无相似Excel的桌面程序,绿色版,实现主要的数 ...
- JavaScript 高级程序设计(第3版)笔记——chapter3:基本概念(函数部分)
3.7函数 3.7.1 理解参数 ECMAScript 函数不介意传递进来多个参数,也不在乎传递进来的参数是什么数据类型.因为在 ECMAScript 中的参数在内部是用一个数组来表示的.在函数体内可 ...
- 【JQuery】eval()出现missing after property id 错误。
是因为数据没有转换成json格式输出就直接eval了. 正确步骤:后台: JsonBinder.buildNormalBinder().toJson(list); 前台: eval('(${posit ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...