码迷,mamicode.com
首页 > 其他好文 > 详细

L - Vases and Flowers HDU - 4614 线段树+二分

时间:2019-02-03 00:59:16      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:二分   upd   ...   c++   check   color   code   else   str   

题意 给出一排空花瓶 有两种操作  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]到输出了 我说怎么会有那么奇葩的输出 。。。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn=50000+5;
  4 int n;
  5 struct Node{
  6     int l,r;
  7     long long sum;
  8     int flag=-1;
  9     void update(int value){
 10         if(value==1){
 11         sum=r-l+1;
 12         flag=1;
 13         }else if(value==0){
 14             sum=0;
 15             flag=0;
 16         }
 17     }
 18 }tree[maxn*4];
 19 void push_up(int x){
 20     tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
 21 }
 22 void push_down(int x){
 23     if(tree[x].flag==1){
 24         tree[x<<1].sum=tree[x<<1].r-tree[x<<1].l+1;
 25         tree[x<<1|1].sum=tree[x<<1|1].r-tree[x<<1|1].l+1;
 26         tree[x<<1|1].flag=tree[x<<1].flag=1;
 27         tree[x].flag=-1;
 28     }
 29     else if(tree[x].flag==0){
 30         tree[x<<1].sum=0;
 31         tree[x<<1|1].sum=0;
 32         tree[x<<1|1].flag=tree[x<<1].flag=0;
 33         tree[x].flag=-1;
 34     }
 35 }
 36 void update(int x,int l,int r,int value){
 37     if(tree[x].l>=l&&tree[x].r<=r){
 38         tree[x].update(value);
 39             return ;
 40     }
 41     int mid=tree[x].l+tree[x].r>>1;
 42     push_down(x);
 43     if(mid>=l)update(x<<1,l,r,value);
 44     if(mid<r)update(x<<1|1,l,r,value);
 45     push_up(x);
 46 }
 47 int  query(int x,int l,int r){
 48     if(tree[x].l>=l&&tree[x].r<=r){
 49     return     tree[x].sum;
 50             
 51     }
 52     int mid=tree[x].l+tree[x].r>>1;
 53     push_down(x);
 54     long long ans=0;
 55     if(mid>=l)ans+=query(x<<1,l,r);
 56     if(mid<r)ans+=query(x<<1|1,l,r);
 57     return ans;
 58 }
 59 void build(int x,int l,int r){
 60     tree[x].l=l,tree[x].r=r;
 61     tree[x].sum=r-l+1;
 62     tree[x].flag=-1;
 63     if(l==r)return ;
 64     int mid=l+r>>1;
 65     build(x<<1,l,mid);
 66     build(x<<1|1,mid+1,r);
 67 }
 68 void work(int a,int f){
 69     int l=a,r=n-1;
 70     int ans1=-1;
 71     int temp=query(1,a,n-1);
 72     if(temp==0){
 73         printf("Can not put any one.\n");
 74         return ;
 75     }
 76     while(l<=r){
 77         int mid=l+r>>1;
 78         if(query(1,a,mid)!=0){
 79             ans1=mid;
 80             r=mid-1;
 81         }
 82         else l=mid+1;
 83     }
 84     l=ans1,r=n-1;
 85     int ans2=-1;
 86     f=min(f,temp);
 87     while(l<=r){
 88         int mid=l+r>>1;
 89         if(query(1,ans1,mid)>=f){
 90             ans2=mid;
 91             r=mid-1;
 92         }
 93         else l=mid+1;
 94     }
 95     printf("%d %d\n",ans1,ans2);
 96     update(1,ans1,ans2,0);
 97 }
 98 int main(){
 99     int t ,m;
100     scanf("%d",&t);
101     while(t--){
102         scanf("%d%d",&n,&m);
103         build(1,0,n-1);
104         int a,b,c;
105         while(m--){
106         scanf("%d%d%d",&a,&b,&c);
107         if(a==1){
108             work(b,c);
109         }
110         if(a==2){
111             
112             printf("%d\n",c-b+1-query(1,b,c));
113             update(1,b,c,1);
114         }
115         }
116         printf("\n");
117         
118     }
119     return 0;
120 }

 

L - Vases and Flowers HDU - 4614 线段树+二分

标签:二分   upd   ...   c++   check   color   code   else   str   

原文地址:https://www.cnblogs.com/ttttttttrx/p/10349475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!