题意:

给你N个花瓶,编号是0  到 N - 1 ,一开始每个花瓶都是空的,你有两个操作:

第一个操作:

从第x个花瓶起开始插花,总共插y束,如果遇到花瓶中有花就跳过这个花瓶,直到花插完或者

插到第N-1个花瓶为止,输出插第一朵花的位置和最后一朵花的位置

第二个操作

将第x个花瓶到第y个花瓶之间的花扔掉,输出扔掉的花的数目

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614

思路

我们通过线段树来记录每个区间中花的数目,区间长度减去该区间中花的数目即为该区间

中空花瓶的数目,我们通过二分位置来确定插花的起始位置和终止位置

代码:

#include <bits/stdc++.h>
int n,m;
using namespace std;
const int MAXN=5e4+;
typedef long long ll;
int lazy[MAXN<<],tree[MAXN<<];
void push_up(int node)
{
tree[node]=tree[node<<]+tree[node<<|];
}
void build(int node,int l,int r)
{
lazy[node]=-,tree[node]=;
if(l==r)
return;
int mid=(l+r)>>;
build(node<<,l,mid);
build(node<<|,mid+,r);
}
void push_down(int node,int l,int r,int mid)
{
if(lazy[node]!=-)
{
lazy[node<<]=lazy[node<<|]=lazy[node];
tree[node<<]=(mid-l+)*lazy[node];
tree[node<<|]=(r-mid)*lazy[node];
lazy[node]=-;
}
}
void update(int node,int l,int r,int x,int y,int k)
{
if(x<=l&&y>=r)
{
lazy[node]=k;
tree[node]=(r-l+)*k;
return;
}
int mid=(l+r)>>;
push_down(node,l,r,mid);
if(x<=mid)
update(node<<,l,mid,x,y,k);
if(y>mid)
update(node<<|,mid+,r,x,y,k);
push_up(node);
}
int query(int node,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
return tree[node];
}
int mid=(l+r)>>;
push_down(node,l,r,mid);
int ans=;
if(x<=mid)
ans+=query(node<<,l,mid,x,y);
if(y>mid)
ans+=query(node<<|,mid+,r,x,y);
return ans;
}
int search_(int x,int num) //二分查找位置
{
int temp=query(,,n,x,n);//x到n的空位数
if(temp==n-x+)//没有空位的情况下
return -;
//如果从x到n的空位数比要插的数少,那么要插的数就是x到n的空位数
if(n-x+-temp<num)
num=n-x+-temp;
int down=x,up=n,index=;
while(down<=up)
{
int mid=(down+up)>>;
if(mid-x+-query(,,n,x,mid)<num)
down=mid+;
else
if(mid-x+-query(,,n,x,mid)>num)
up=mid-;
else
{
index=mid;up=mid-;
}
}
return index;
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);n--;
build(,,n);
while(m--)
{
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==)
{
int fir=search_(x,);//寻找第一个位置
if(fir==-)
printf("Can not put any one.\n");
else
{
int sec=search_(x,y);//寻找第二个位置
printf("%d %d\n",fir,sec);
update(,,n,fir,sec,);//修改区间值
}
}
else
{
printf("%d\n",query(,,n,x,y));
update(,,n,x,y,);//修改区间值
}
}
printf("\n");
}
return ;
}

Vases and Flowers-HDU4614 二分+线段树的更多相关文章

  1. hdu 4614 Vases and Flowers (二分 线段树)

    题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花.然后又如下两个操作. 1:A B    从第A个花瓶开始,往后依次插B朵花,直到不能插为止.如果一朵花都不能插入就输出“can.....”,否则输出第 ...

  2. L - Vases and Flowers HDU - 4614 线段树+二分

    题意 给出一排空花瓶 有两种操作  1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个  如果没有输出 can not. ...

  3. HDU4614 Vases and Flowers 二分+线段树

    分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...

  4. J - Joseph and Tests Gym - 102020J (二分+线段树)

    题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高 ...

  5. Educational Codeforces Round 61 D 二分 + 线段树

    https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...

  6. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  7. hdu6070 Dirt Ratio 二分+线段树

    /** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...

  8. K-th occurrence HDU - 6704 (后缀数组+二分线段树+主席树)

    大意: 给定串s, q个询问(l,r,k), 求子串s[l,r]的第kk次出现位置. 这是一篇很好的题解: https://blog.csdn.net/sdauguanweihong/article/ ...

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

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

  10. hdu4614(线段树+二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给定一个区间[0,N-1],初始时每个位置上的数字都是0,可以对其进行以下两种操作: 1. ...

随机推荐

  1. 【资源分享】RPG Maker 2000/2003 简体中文版

    *----------------------------------------------[下载区]----------------------------------------------* ...

  2. java双亲委派模型

    Java类加载器(ClassLoader) 双亲委派模式要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,请注意双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来 ...

  3. .net core 框架调用顺序

    API -> AppSrv -> IRepository -> Repository ->

  4. Dart语言学习(八) dynamic

    dynamic 表示是动态的,数据类型是指任意类型 var a; a = ; a = "Dart"; print(a); dynamic b = ; b = "JavaS ...

  5. 什么是buffer?

    Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的.且在 V8 堆外分配物理内存. Buffer 的大小在被创建时确定,且无法调整. Buffer 类在 Node.js 中是一个全 ...

  6. java8date

    Java 8:新的时间和日期API 在Java 8之前,所有关于时间和日期的API都存在各种使用方面的缺陷,因此建议使用新的时间和日期API,分别从旧的时间和日期的API的缺点以及解决方法.Java ...

  7. 【代码学习】PYTHON 生成器

    一.生成器 一遍循环一遍计算的机制,称为生成器 二.生成器的特点: 1.节约内存 2.迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的, ...

  8. qq音乐解析API

    文档:www.tjit.net 开放的接口:api88.net 个人代码: input2(event){ //将字符转化为encodeURL编码,才能进行正确请求,这是这个接口要求的 //js自带的转 ...

  9. 获取自增长的id值

    单个: <insert id="create" parameterType="com.dto.Cou" useGeneratedKeys="tr ...

  10. Windows 10下一步一步创建 Scrapy框架的项目

    此文是本人的学习笔记,网上搜索了很多资料,也走了一些弯路,记录下安装的过程,以便日后回顾 1.安装Anaconda3,安装时默认选项 2.装完Anaconda3后,打开系统变量在path路径下增加An ...