题目链接

比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性。线段树中的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(线段树+二分)的更多相关文章

  1. hdu 4614 Vases and Flowers 线段树

    题目链接 一共n个盒子, 两种操作, 第一种是给出两个数x, y, 从第x个盒子开始放y朵花, 一个盒子只能放一朵, 如果某个盒子已经有了, 那么就跳过这个盒子放下面的盒子. 直到花放完了或者到了最后 ...

  2. hdu4614 Vases and Flowers 线段树+二分

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

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

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

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

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

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

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

  6. 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 ...

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

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

  8. HDU 4614 Vases and Flowers (2013多校第二场线段树)

    题意摘自:http://blog.csdn.net/kdqzzxxcc/article/details/9474169 ORZZ 题意:给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每 ...

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

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

随机推荐

  1. [ruby on rails] 跟我学之(3)基于rails console的查增删改操作

    本章节展开对model的介绍:包括查增删改操作.紧接着上面一节<[ruby on rails] 跟我学之HelloWorld> 创建模型 使用命令创建模型 创建表post,默认自带两栏位 ...

  2. python - PyQuery

    偶尔的机会,知道这么个扩展,手贱翻了下文档,发现似乎挺有意思,遂记录一二. what: 这是一个python版本的jquery,而且是后端执行的,至少官方是这么说的: pyquery allows y ...

  3. 【Hadoop】HIVE 小结概览

    一.HIVE概览小结 二.HIVE安装 Hive只在一个节点上安装即可 .上传tar包 .解压 tar -zxvf hive-.tar.gz -C /cloud/ .配置mysql metastore ...

  4. 回调函数callback

    你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给 ...

  5. KDD-CUP Proposal

    From 鞠源 已有 1303 次阅读 2012-11-25 21:09 |系统分类:科研笔记|关键词:会议 领域 justify 知识 KDDCUP - Competition is a stron ...

  6. JS实现多附件上传(asp.net)

    前几天,用户提出一个需求-多附件上传,另外,每个上传文件要加一个别名,本人创新少,从网上收集了资料,稍微改写,满足了 客户的需求.在应用到程序之前,先做了个小测试,测试通过,小高兴,就记录下了这个小测 ...

  7. 【JAVA、C++】LeetCode 006 ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  8. codeforces 483C.Diverse Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/483/C 题目意思:给出 n 和 k,要求输出一个含有 n 个数的排列 p1, p2, ...,pn,使得 ...

  9. MySQL 查询最大最小值优化

    1. 假设你使用了Innodb存储引擎2. 假设你在innodb设定了主键(聚集索引) 3. 因为聚集索引页面之间是通过双向链表链接,页按照主键的顺序排序 每个页中的记录也是通过双向链表维护.聚集索引 ...

  10. CentOS下配置Hadoop集群:java.net.NoRouteToHostException: No route to host问题的解决

    我用的是hadoop 1.2.1 遇到的问题是: hadoop中datanode无法启动,报Caused by: java.net.NoRouteToHostException: No route t ...