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. ...
随机推荐
- 避免重复数据查询DISTINCT
[1]避免重复——DISTINCT SELECT DISTINCT job FROM t_enployee; #去除job字段的重复项,只显示所有job字段中的非重复项,比如job里有:te ...
- maven的安装与使用(运行单元测试和打包等)
maven的下载与安装 maven是用于java的自动化构建工具. 1.下载: http://maven.apache.org/download.cgi 下载maven包,比如 apache-mave ...
- blog主题——黑夜
blog主题,存储一下 /* Author: Io_oTI*/ /*Public*/ * { margin: 0; padding: 0; box-sizing: border-box; trans ...
- 南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup
南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup 题目描述 文件下载地址 很明显,文件之间进行亦或就可得到flag,不再多说,直接上脚本 #coding:utf-8 file_a = ...
- oracle备份报“EXP-00056: 遇到 ORACLE 错误 12541”
今天准备接手一个新项目,首先是dang项目和备份数据库到本地,但是在备份数据库的时候报错误: EXP-00056: 遇到 ORACLE 错误 12541 ORA-12541: TNS: 无监听程序 E ...
- .net core 通过代码创建数据库表
0.结构: 1.API using System; using System.Collections.Generic; using System.IO; using System.Linq; usin ...
- linux 网络数据收发网络流量监控
网卡流量 1.iftop命令 iftop可以用来监控网卡的实时流量(可以指定网段).反向解析IP.显示端口信息.TCP/IP连接等官网:http://www.ex-parrot.com/~pdw/if ...
- idea2019.2激活至2089年!
上图! 激活到2089年8月,绝对够用! 注意:在激活之前,无需改动 host 文件. 资料自取:链接:https://pan.baidu.com/s/1MzX5ewt6lbzHYuggP5sGE ...
- Springmvc-crud-03(静态资源错误)
错误描述:静态资源加载失败 原因:spring会拦截静态资源 解决办法: <!-- 配置spring支持静态资源请求 --> <mvc:default-servlet-handler ...
- 喵星之旅-狂奔的兔子-docker安装和基本使用
一.前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. 位.系统内核版本为 3.10 以上. 位系统.参考喵星之旅-狂奔的兔子-linux安装 二.CentOS 7下安装 Doc ...