L - Vases and Flowers HDU - 4614 线段树+二分
题意 给出一排空花瓶 有两种操作 1是 从A花瓶开始放F朵花 如果当前瓶有花就跳过前往下一个 直到花用完或者 瓶子到了最后一个为止 输出 成功放花的第一个和最后一个 如果没有输出 can not.......
2是 清空 一段区间的花 并输出清空了多少朵花
思路:用线段树维护一段区间有多少空花瓶 1操作 就是两次二分 分别求起点和终点 起点 check条件是 query(1,a,mid)>0 终点是 query(1,二分出的起点,mid)>=min(f,query(1,a,n-1)) 这里min是因为有可能总共就没有那么多空瓶子 而二分要求的是最后一个放的空瓶子 如果不min 一旦不够每次 二分出的都是n-1就不符合题意了
还有就是吐槽一下vj爬网页爬出 [pre]到输出了 我说怎么会有那么奇葩的输出 。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int n;
struct Node{
int l,r;
long long sum;
int flag=-;
void update(int value){
if(value==){
sum=r-l+;
flag=;
}else if(value==){
sum=;
flag=;
}
}
}tree[maxn*];
void push_up(int x){
tree[x].sum=tree[x<<].sum+tree[x<<|].sum;
}
void push_down(int x){
if(tree[x].flag==){
tree[x<<].sum=tree[x<<].r-tree[x<<].l+;
tree[x<<|].sum=tree[x<<|].r-tree[x<<|].l+;
tree[x<<|].flag=tree[x<<].flag=;
tree[x].flag=-;
}
else if(tree[x].flag==){
tree[x<<].sum=;
tree[x<<|].sum=;
tree[x<<|].flag=tree[x<<].flag=;
tree[x].flag=-;
}
}
void update(int x,int l,int r,int value){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].update(value);
return ;
}
int mid=tree[x].l+tree[x].r>>;
push_down(x);
if(mid>=l)update(x<<,l,r,value);
if(mid<r)update(x<<|,l,r,value);
push_up(x);
}
int query(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r){
return tree[x].sum; }
int mid=tree[x].l+tree[x].r>>;
push_down(x);
long long ans=;
if(mid>=l)ans+=query(x<<,l,r);
if(mid<r)ans+=query(x<<|,l,r);
return ans;
}
void build(int x,int l,int r){
tree[x].l=l,tree[x].r=r;
tree[x].sum=r-l+;
tree[x].flag=-;
if(l==r)return ;
int mid=l+r>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
}
void work(int a,int f){
int l=a,r=n-;
int ans1=-;
int temp=query(,a,n-);
if(temp==){
printf("Can not put any one.\n");
return ;
}
while(l<=r){
int mid=l+r>>;
if(query(,a,mid)!=){
ans1=mid;
r=mid-;
}
else l=mid+;
}
l=ans1,r=n-;
int ans2=-;
f=min(f,temp);
while(l<=r){
int mid=l+r>>;
if(query(,ans1,mid)>=f){
ans2=mid;
r=mid-;
}
else l=mid+;
}
printf("%d %d\n",ans1,ans2);
update(,ans1,ans2,);
}
int main(){
int t ,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
build(,,n-);
int a,b,c;
while(m--){
scanf("%d%d%d",&a,&b,&c);
if(a==){
work(b,c);
}
if(a==){ printf("%d\n",c-b+-query(,b,c));
update(,b,c,);
}
}
printf("\n"); }
return ;
}
L - Vases and Flowers HDU - 4614 线段树+二分的更多相关文章
- L - Vases and Flowers - hdu 4614(区间操作)
题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉.操作2把区间清空 分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩 ...
- HDU 4614 线段树+二分查找
Vases and Flowers 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4614 Problem Description Alice is s ...
- G - Queue HDU - 5493 线段树+二分
G - Queue HDU - 5493 题目大意:给你n个人的身高和这个人前面或者后面有多少个比他高的人,让你还原这个序列,按字典序输出. 题解: 首先按高度排序. 设每个人在其前面有k个人,设比这 ...
- hdu 4614 线段树
思路:当k为1的时候,用二分法查询包含有f个空瓶的上界r,然后更新会方便很多,直接更新区间(a,r)了. #include<iostream> #include<cstdio> ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
随机推荐
- centos 7 java1.8安装
java安装 检查版本信息,如果版本小于1.8,执行以下命令 java -version java version "1.8.0_144"Java(TM) SE Runtime E ...
- 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车
朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车 [下载本文PDF进行阅读] 这里所说的三架马车是指微服务.消息队列和定时任务.如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构 ...
- 翻转一个数组(c++实现)
反转一个数组: 其实STL中的vector有一个reverse函数便可以使用. #include<iostream> using namespace std; int* ReverseAr ...
- Golang-教程
http://www.runoob.com/go/go-environment.html https://www.pythonav.cn/
- Django的路由层
U RL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代 ...
- python_函数名的应用、闭包、装饰器
0.动态传参内容补充: 0.1 单纯运行如下函数不会报错. def func1(*args,**kwargs): pass func1() 0.2 *的魔性用法 * 在函数定义的时候,代表聚合. *在 ...
- PHP之常用设计模式
在日常开放中,经常会用到一些设计模式,进行我们代码的优化处理,一个很好的设计思想 1) 工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 ...
- IdentityServer4【Introduction】之概括
The Big Picture 大多数现代应用看起来都像下面的样子: 大多数的交互是下面这样: 浏览器与web应用之间的通信 web应用和web APIs之间的通信(这两者有时是独立的,有时是有用户参 ...
- Netty ByteBuf和Nio ByteBuffer
参考https://blog.csdn.net/jeffleo/article/details/69230112 一.简介 Netty中引入了ByteBuf,它相对于ByteBuffer来说,带来了很 ...
- 对C#调用C++的dll的一点思考
最近在对接C++程序的时候碰到了一些问题,然后花了一段时间才解决,今天就这些小问题来做一个总结,很多时候由于对另外一种开发语言的不熟悉,会在使用的过程中遇到很多的问题,这些问题看似简单但是背后却有很多 ...