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) ...
随机推荐
- Python从菜鸟到高手(6):获取用户输入、函数与注释
1. 获取用户输入 要编写一个有实际价值的程序,就需要与用户交互.当然,与用户交互有很多方法,例如,GUI(图形用户接口)就是一种非常好的与用户交互的方式,不过我们先不讨论GUI的交互方式,本节会 ...
- Linq to XML操作XML文件
LINQ的类型 在MSDN官方文件中,LINQ分为几种类型: . LINQ to Objects(或称LINQ to Collection),这是LINQ的基本功能,针对集合对象进行查询处理,包括基本 ...
- .NET-记一次架构优化实战与方案-前端优化
目录 .NET-记一次架构优化实战与方案-梳理篇 .NET-记一次架构优化实战与方案-前端优化 .NET-记一次架构优化实战与方案-底层服务优化 前言 上一篇<.NET-记一次架构优化实战与方案 ...
- C# Type.GetType 返回NULL 问题解决记录
Type.GetType("OP.Client.Html.Resources.KenFengFormMethod"); 从Dll里面获取KenFengFormMethod这个会返回 ...
- 剑指offer--4.重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
- Centos7修改系统时区
timedatectl status Local time: 四 2014-12-25 10:52:10 CST Universal time: 四 2014-12-25 02:52:10 UTC R ...
- 计算机名称改名之后,tfs连接问题
计算机名称改名之后,我们发现tfs连接会有问题 打开vs下的“开发人员命令提示”执行下面两条语句: 1.tf workspaces 2.tf workspaces /collection:http:/ ...
- 如果需要精确的答案,请避免使用float和double
Java中的简单浮点数类型float和double不能够进行运算.不光是Java,在其它很多编程语言中也有这样的问题.在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上 ...
- vue路由动态过渡效果
不多说,直接上代码 import Vue from 'vue' //引入vue import VueRouter from 'vue-router' //引入路由 Vue.use(VueRouter) ...
- Laravel 门面实例教程 —— 创建自定义 Facades 类
我们首先创建一个需要绑定到服务容器的Test类: <?php namespace App\Facades; class Test { public function doSomething() ...