HDU 4614 Vases and Flowers(线段树+二分)
比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性。线段树中的lz标记很强大,这个题的题意也挺纠结的。
k = 1时,从a开始,插b个花,输出第一个插的位置,最后一个的位置,一个都没插,输出不能插。
k = 2时,将[a,b]区间都清空,输出这个区间上本来有多少朵花。
主要是k = 1的时候,很难弄。给出区间[a,b]要找到第一个空花瓶,空花瓶的个数 = 总的-插花的个数
这肯定是一个单增的,所以利用二分求下界,这个位置,就是第一个空花瓶的位置,最后一个花瓶的位置需要特判一下,确定是第几个空花瓶,剩下的跟算第一个差不多。
主要是很多细节要注意,写代码要各种严谨....
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[*];
int lz[*];
int n;
void pushup(int rt)
{
sum[rt] = sum[rt<<] + sum[rt<<|];
}
void pushdown(int rt,int m)
{
if(lz[rt] == )
{
lz[rt<<] = lz[rt];
lz[rt<<|] = lz[rt];
sum[rt<<] = (m - (m>>));
sum[rt<<|] = (m>>);
lz[rt] = ;
}
else if(lz[rt] == -)
{
lz[rt<<] = lz[rt];
lz[rt<<|] = lz[rt];
sum[rt<<] = ;
sum[rt<<|] = ;
lz[rt] = ;
}
}
int query(int L,int R,int l,int r,int rt)
{
int m;
int ans = ;
if(l >= L&&r <= R)
{
return sum[rt];
}
pushdown(rt,r-l+);
m = (l+r)>>;
if(L <= m) ans += query(L,R,lson);
if(R > m) ans += query(L,R,rson);
return ans;
}
void update(int L,int R,int sc,int l,int r,int rt)
{
int m;
if(l >= L&&r <= R)
{
lz[rt] = sc;
if(sc == )
sum[rt] = (r - l + );
else
sum[rt] = ;
return ;
}
pushdown(rt,r-l+);
m = (l+r) >> ;
if(L <= m) update(L,R,sc,lson);
if(R > m) update(L,R,sc,rson);
pushup(rt);
}
int bis(int x,int key)
{
int str,end,mid,temp;
str = x,end = n-;
if(end-x+ - query(x,end,,n-,) == )
return -;
while(str < end)
{
mid = (str + end)/;
temp = (mid-x+) - query(x,mid,,n-,);
if(temp < key)
str = mid + ;
else
end = mid;
}
return str;
}
int bin(int x,int key)
{
int str,end,mid,temp;
str = x;end = n-;
temp = (n-x) - query(x,n-,,n-,);
if(key > temp)
key = temp;
while(str < end)
{
mid = (str + end)/;
temp = (mid-x+) - query(x,mid,,n-,);
if(temp < key)
str = mid + ;
else
end = mid;
}
return str;
}
int main()
{
int t,m,i,a,b,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(sum,,sizeof(sum));
memset(lz,,sizeof(lz));
for(i = ;i <= m;i ++)
{
scanf("%d%d%d",&k,&a,&b);
if(k == )
{
a = bis(a,);
if(a != -)
b = bin(a,b);
if(a == -)
printf("Can not put any one.\n");
else
{
printf("%d %d\n",a,b);
update(a,b,,,n-,);
}
}
else
{
printf("%d\n",query(a,b,,n-,));
update(a,b,-,,n-,);
}
}
printf("\n");
}
return ;
}
HDU 4614 Vases and Flowers(线段树+二分)的更多相关文章
- hdu 4614 Vases and Flowers 线段树
题目链接 一共n个盒子, 两种操作, 第一种是给出两个数x, y, 从第x个盒子开始放y朵花, 一个盒子只能放一朵, 如果某个盒子已经有了, 那么就跳过这个盒子放下面的盒子. 直到花放完了或者到了最后 ...
- hdu4614 Vases and Flowers 线段树+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- 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(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
- HDU 4614 Vases and Flowers 【线段树】+【二分】
<题目链接> 题目大意: 有n个花瓶,每个花瓶中只能放一朵花.两种操作,一种是从A开始放F朵花,如果有的花瓶中已经有花则跳过这个花瓶,往下一个花瓶放:第二种是将区间[A,B]之间花瓶中的花 ...
- 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(线段树+记录区间始末点或乱搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...
- HDU 4614 Vases and Flowers (2013多校第二场线段树)
题意摘自:http://blog.csdn.net/kdqzzxxcc/article/details/9474169 ORZZ 题意:给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每 ...
- hdu 4614 Vases and Flowers(线段树:成段更新)
线段树裸题.自己写复杂了,准确说是没想清楚就敲了. 先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了. 重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新 ...
随机推荐
- BZOJ 1002 [ FJOI 2007 ]
-------------------------萌萌哒分割线------------------------- 题目很容易看懂,数据范围也不大.当然可以卡过暴力的人了. 在n=1时很明显是一种,如下 ...
- bash read命令用法
read -p "Enter your student ID: " USERNAMEread -s -p "Enter your password: " PAS ...
- excel中如何批量将所有的网址设为超链接
首先如果数据较少的话,只需要双击鼠标左键,回车,就会自动转换成超链接. 转自: http://zhidao.baidu.com/question/200363361.html?qbl=relate_q ...
- JAVA 中BIO,NIO,AIO的理解
[转自]http://qindongliang.iteye.com/blog/2018539 ?????????????????????在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解 ...
- css样式自适应,支持数字
td加上style="word-break: break-all;word-wrap: break-word;"样式即可
- Repairing Company(poj 3216)
题目大意: 有Q个地点,告诉你Q个地点之间的相互距离(从i地点赶到j地点需要的时间).有M项任务, 给你M项任务所在的地点block.开始时间start和任务完成需要时间time.一个工人只有在 他准 ...
- Hadoop入门经典:WordCount
转:http://blog.csdn.net/jediael_lu/article/details/38705371 以下程序在hadoop1.2.1上测试成功. 本例先将源代码呈现,然后详细说明执行 ...
- Linux命令--文件权限和磁盘管理
1.chmod chmod [ugoa][+-=][rwx] file 改变目录或者文件的权限. u是user,g是group,o是other,a是all. +是添加权限,-是去掉权限,=改变权限为. ...
- java 基本数据类型
long 是长整型,在怎么长本身也是整型,12.10的整形部分是12,当然结果是12, byte: 八位整数 -128——127,可用来节省内存的使用.short: 16位整数 -32768——32, ...
- 【转】一个不错的eclipse反编译插件
[转]一个不错的eclipse反编译插件 在CSDN论坛上看到的一个不错的eclipse反编译插件,感觉看起来不错的样子,因而记下,原网址是:http://topic.csdn.net/u/20121 ...