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为:找出真正插画的开始点和终止点,做成段更新 ...
随机推荐
- puppet组织架构
树结构如下: |-- puppet.conf #主配置配置文件 |-- fileserver.conf #文件服务器配置文件 |-- auth.conf #认证配置文件 |-- autosign.co ...
- Thinkphp中eq,neq,gt,lt等表达式缩写
eq 等于 equalneq 不等于gt 大于 greater thanegt 大于等于lt 小于 less thanelt 小于等于like LIKEbetween BETWEENno ...
- MYSQL 删除字段值为NULL的语法
2014年9月1日 15:11:05 delete form your_table where your_field is null and your_field1 = '123' ...
- BestCoder13 1001.Beautiful Palindrome Number(hdu 5062) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5062 题目意思:给出 N,找出 1 - 10^N 中满足 Beautiful Palindrome N ...
- Python Elasticsearch api
描述:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.下面介绍了利用Python API接口进行数据查询,方便 ...
- dt.jar设计时rt.jar运行时
很多人在初学Java的时候,都要配置环境变量.在配置CLASSPATH的时候,都会加上一个当前目录.,还有两个jar:dt.jar和tools.jar.其实好多人都不了解这两个jar的作用,尤其是dt ...
- vmware安装linux.iso
安装方法 : .进入Fedora后,在虚拟机选项栏中选VM->install vmware tools 拷贝VMware Tools.tar.gz到指定文件夹,解压缩 进入超级终端:在-> ...
- JS生成某个范围的随机数(四种情况)
前言: JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉 ...
- JUC回顾之-Semaphore底层实现和原理
1.控制并发线程数的Semaphore Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,保证合理的使用公共资源. 线程可以通过acquire()方法来获取信号量的 ...
- Java Hour 35 Weather ( 8 ) struts2 – message resource
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 35 刚发表了一条闪存,在这个公司快满3个月了,该正式决定留下来还是 ...