题意 给出一排空花瓶 有两种操作  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 线段树+二分的更多相关文章

  1. L - Vases and Flowers - hdu 4614(区间操作)

    题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉.操作2把区间清空 分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩 ...

  2. HDU 4614 线段树+二分查找

    Vases and Flowers 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4614 Problem Description Alice is s ...

  3. G - Queue HDU - 5493 线段树+二分

    G - Queue HDU - 5493 题目大意:给你n个人的身高和这个人前面或者后面有多少个比他高的人,让你还原这个序列,按字典序输出. 题解: 首先按高度排序. 设每个人在其前面有k个人,设比这 ...

  4. hdu 4614 线段树

    思路:当k为1的时候,用二分法查询包含有f个空瓶的上界r,然后更新会方便很多,直接更新区间(a,r)了. #include<iostream> #include<cstdio> ...

  5. 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 ...

  6. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

随机推荐

  1. centos 7 java1.8安装

    java安装 检查版本信息,如果版本小于1.8,执行以下命令 java -version java version "1.8.0_144"Java(TM) SE Runtime E ...

  2. 剑指offer--1.二维数组中的查找

    题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  3. Python-正则表达式总结版

    前言: 总是写不好正则表达式,时间长不用就有些忘记了,故此在总结一篇文章以便日后查阅. 一.常用的匹配规则总结表 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空 ...

  4. Leetcode 143. Reorder List(Medium)

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...

  5. H5 54-清空默认边距

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. hdu3790 dijkstra+堆优化

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3790 分析:dijkstra没有优化的话,复杂度是n*n,优化后的复杂度是m*logm,n是顶点数,m ...

  7. pandas删除某一列的方法

    方法一:直接del df['column-name'] 删除sub_grade_列, 输入del df['sub_grade_x'] 方法二:采用drop方法,有下面三种等价的表达式: 1. df= ...

  8. DOM节点左右移动

    闲来没事写了个小demo,原本是回答别人博问的,有人比我更快的给出了链接,想想半途而废也不好,就写完了,写个博文记录一下(效果是按照我自己来的,可能和最早别人问的不太一样,反正无关紧要啦) 直接上co ...

  9. mysql备份(导出)数据库,并恢复数据

    导出某个数据库数据到文件中 假设要导出test这个数据库,那么可以在Linux命令行(不是在mysql中) [root@ubuntu /data]# mysqldump -uroot -p test ...

  10. 【学习总结】GirlsInAI ML-diary day-2-Python版本选取与Anaconda中环境配置与下载

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day2 Python版本选取与Anaconda中环境配置与下载 1-查看当前Jupyter的Python版本 开始菜单选J ...