Vases and Flowers-HDU4614 二分+线段树
题意:
给你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 二分+线段树的更多相关文章
- hdu 4614 Vases and Flowers (二分 线段树)
题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花.然后又如下两个操作. 1:A B 从第A个花瓶开始,往后依次插B朵花,直到不能插为止.如果一朵花都不能插入就输出“can.....”,否则输出第 ...
- L - Vases and Flowers HDU - 4614 线段树+二分
题意 给出一排空花瓶 有两种操作 1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个 如果没有输出 can not. ...
- HDU4614 Vases and Flowers 二分+线段树
分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...
- J - Joseph and Tests Gym - 102020J (二分+线段树)
题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高 ...
- Educational Codeforces Round 61 D 二分 + 线段树
https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- hdu6070 Dirt Ratio 二分+线段树
/** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...
- K-th occurrence HDU - 6704 (后缀数组+二分线段树+主席树)
大意: 给定串s, q个询问(l,r,k), 求子串s[l,r]的第kk次出现位置. 这是一篇很好的题解: https://blog.csdn.net/sdauguanweihong/article/ ...
- HDU 4614 Vases and Flowers(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
- hdu4614(线段树+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给定一个区间[0,N-1],初始时每个位置上的数字都是0,可以对其进行以下两种操作: 1. ...
随机推荐
- MySQL 学习(二)总体框架 & redo-log 和 bin-log 的介绍
文章部分总结来自课程,非原创 MySQL 组织架构 下面这张图就可以解释关于 MySQL 底层的组织架构了. 上面的图可以直观地展示两个重要的东西 : 一条 SQL 的执行流程 MyS ...
- linux shell ansible 命令详解
也可以参考ansible 模块介绍的其他文章:https://www.cnblogs.com/guxiaobei/p/8316903.html 安装ansible yum install epel-r ...
- 前端之HTML基础篇
HTML基础篇 目录 本章内容: 简介 1. ...
- queue的使用-Hdu 1702
ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- .Net Core 认证组件之Cookie认证组件解析源码
接着上文.Net Core 认证系统源码解析,Cookie认证算是常用的认证模式,但是目前主流都是前后端分离,有点鸡肋但是,不考虑移动端的站点或者纯管理后台网站可以使用这种认证方式.注意:基于浏览器且 ...
- MyBatis-Spring整合之方式1
导入相关包:Spring包:Spring架包 MyBatis包:MyBatis架包 整合包:Mybatis-Spring整合包 编写实体类User,实体类的sql映射文件,映射内容如下: <?x ...
- keil(MDK)错误记录
1.a parameter list without types is only allowed in a function definition(没有类型的参数列表只允许在函数定义中使用) 2.Er ...
- 以C语言为例完成简单的网络聊天程序以及关于socket在Linux下系统调用的分析
套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程. 端 ...
- JAVA基础学习(6)之使用对象
6使用对象 6.1字符类型 6.1.1字符类型 char和int互相转换 //a比A大32 Scanner in=new Scanner(System.in); char c='B'; char c1 ...
- [踩坑记录] windows10 应用商店打不开 代码: 0x80131500
在某博客看到的方法,供参考,可以尝试一下,我的也是这么解决的1.打开“运行”输入 inetcpl.cpl (“WINDOWS”+“R”键,输入 inetcpl.cpl亦可)2.点开高级往下拉,勾上&q ...