Vases and Flowers

hdu4614:http://acm.hdu.edu.cn/showproblem.php?pid=4614

题意:给你n个花瓶,然后有两种操作:1从a开始选择b个花瓶,放进花,输出左端点,右端点

2把a到b之间的花瓶中的花拿走,输出拿走的花的数目。

题解:一看数据范围就知道是线段树,sum维护区间空的花瓶的个数,flag作为lazy标记,如果flag==1表示清空,flag==0表示填满。这一题重要的地方就是二分。

二分找左边的端点,二分找右边的端点。这是这一题的关键,复杂度就是M*logN*logN.二分就是一件神器啊。注意一些细节的处理。

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

时间: 2024-12-18 07:39:27

Vases and Flowers的相关文章

hdu4614 Vases and Flowers

Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2148    Accepted Submission(s): 836 Problem Description Alice is so popular that she can receive many flowers everyday. She has

hdu 4614 Vases and Flowers

http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:有N个花瓶,标号为0-N-1,往每一个花瓶放一朵花,然后有M个操作,输入a,b,c,如果a==1表示从b开始放花,期间有花就跳过,直到结束,如果没有放入一朵花,则输出“Can not put any one.”,否则输入第一朵花放的位置和最后一朵花放的位置. 如果a==2 则输出拔掉的花的朵数. 1 #include <cstdio> 2 #include <cstring> 3 #

HDOJ 4614 Vases and Flowers

线段树+二分区间 用线段树维护某一段内还有多少个花瓶可以用,二分确定插入的左右界..... Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1782    Accepted Submission(s): 700 Problem Description Alice is so popular that

HDU 4614 Vases and Flowers 线段树+二分

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:N个花瓶,两种操作. 操作1:从第a个花瓶开始放花,放最多f个,如果花瓶已经有花就跳过,直到放完,或者无更多花瓶,要求输出这次放花的第一个位置和最后一个位置,如果没放就输出Cannot... 操作2:将花瓶a到b区间内的花都扔了,然后输出扔掉的花的数目. 解题思路:花瓶有花为0,无花为1,那么实际上这是一个区间更新以及求和,求左右端点的问题.线段树节点维护一个 sum--区间和,lid-

HDU 4614 Vases and Flowers(线段树区间更新+二分)

Problem Description Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N-1. When she receive some flowers, she will try to put them in the vases, one flower in one vase. She randomly choose the vase A a

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

题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉.操作2把区间清空 分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩余的花瓶数,要不没办法更新. ******************************************************************* #include<algorithm>#include<stdio.h>using namespace std; #de

【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或者二分找出第num+1个空瓶子的下标,和第num+b个空瓶子的下标.再区间更新为满.操作2,也相当于区间更新为空. #include<cstdio> #include<cstring> #include<algorithm> #define N 50001 using na

【HDU-4614】Vases and Flowers(线段树双查询)

11946317 2014-10-23 09:08:28 Accepted 4614 437MS 2348K rid=11946317" target="_blank" style="color:rgb(26,92,200); text-decoration:none">3340 B G++ KinderRiven #include<cstdio> #include<cstring> #include<iostream&

HDU-4614 Vases and Flowers (线段树区间更新)

题目大意:有n个花瓶,每个花瓶中只能放一朵花.两种操作,一种是从A开始放F朵花,如果有的花瓶中已经有花则跳过这个花瓶,往下一个花瓶放:第二种是将区间[A,B]之间花瓶中的花清空.如果是第一种操作,输出这次放的花的左右端点:如果是第二种操作,输出这次总共清理出了多少支花. 题目分析:建立线段树,节点维护在相应的区间中,没有放入花的花瓶数目.有三种操作:一.查询某个区间中第k个没有插入花的花瓶位置:二.更新区间,使区间全部插入花:三.更新区间,使区间中的花瓶全部清空: 代码如下: # include