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为:找出真正插画的开始点和终止点,做成段更新 ...
随机推荐
- 浅谈B树
B树即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...
- linux /etc/rc.d/目录的详解
rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录. rcx.d/: 各个启动级别的执行程序连接目录.里头的东西都是指向init.d/的一些软连接.具体的后边叙述. 还有三个 ...
- Swap Nodes & Reverse Nodes in k-Group
Swap Nodes | Given a linked list, swap every two adjacent nodes and return its head. Example Given 1 ...
- Java for LeetCode 050 Pow(x, n)
Implement pow(x, n). 解题思路: 直接使用乘法实现即可,注意下,如果n很大的话,递归次数会太多,因此在n=10和n=-10的地方设置一个检查点,JAVA实现如下: static p ...
- 数列(codevs 1141)
题目描述 Description 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13 ...
- php 面向对象之继承、多态和静态方法
<?php //继承:子类可以继承父类的一切 //特点:单继承 //父类 class Ren { public $name; public $sex; public $yuyan; functi ...
- SQLite常用网址
英文版SQLite官网: http://www.sqlite.org/rescode.html中文版SQLite官网:http://www.helplib.net/s/sqlite/9/167.sht ...
- CI当开启URL重写的时候,报错500 Internal Server Error
Internal Server Error The server encountered an internal error or misconfiguration and was unable to ...
- C# Window Form播放音乐的4种方式
C#播放背景音乐通常有四种方式: 1.播放系统事件声音 2.使用System.Media.SoundPlayer播放wav------------------------仅仅是对波形音乐 3.使用MC ...
- ASP.NET Web.Config 读写辅助类
using System; using System.Configuration; using System.Web; using System.Web.Configuration; namespac ...