HDU 4614Vases and Flowers(线段树)

来源:互联网 发布:python中文乱码解决sys 编辑:程序博客网 时间:2024/05/16 20:29

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614

题目意思:每一组的第一行有两个数n,m, n表示花瓶数量0~n-1,开始全为空,接下来有m组,每组有数k,a,b;当k=1时, 从a位置开始插花,b为花数量,当花瓶有花时,跳过当前,直到找到空花瓶再插入,输出插入第一支花的位置和最后一支花的位置,花可以没插完,当一支都没有插入则输出Can not put any one.;当k=2时,清空【a,b】的花瓶,并输出在范围内花的数量。

思路:

延迟标记lazy 用于判断是否全为空或全为满则为1,否则为0

void query(int L,int c,int l,int r,int rt){if(c<=0)return ;if(L<=l&&r<=R&&lazy[rt])//在范围内  且全为空或者全为满{if(!sum[rt])//全为空{ans-=(r-l+1);sum[rt]=(r-l+1);if(ql<0)ql=l;qr=r;}else//如果全为满 不能插花 想要跳过 因此右的边界范围扩大{R+=(r-l+1);if(R>n)R=n;}return ;}if(lazy[rt])pushdown(rt,r-l+1);lazy[rt]=0;int  m=(l+r)>>1;if(L<=m)query(L,c,lson);if(R>m)query(L,c,rson);pushup(rt,r-l+1);}

需要理解的可能就是这个query函数  他全为满的时候 ,想要跳过 ,因此右的边界范围扩大!

而且这个右边界不能设为局部变量 应该为全局变量 这样函数递归对R的变化才能影响到所有的递归函数!!

#include<iostream>#include<cmath>#include<cstdio>#include<iomanip>#include<cstring>#include<stdlib.h>#include<string>#include<algorithm>#include<queue>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int  maxn =50001;int  sum[maxn<<2];//sum为在范围内的花数int ql,qr,ans;int n,m;int  lazy[maxn<<2];//lazy为判断是否全为空或全为满则为1,否则为0void pushup(int rt,int m)//将当前结点的信息更新的父节点{sum[rt]=sum[rt<<1]+sum[rt<<1|1];if(sum[rt]==m||!sum[rt])lazy[rt]=1;elselazy[rt]=0;}void pushdown(int rt,int  m)//延迟标记向下推 m为长度{if(sum[rt]==m)//全为满{sum[rt<<1]=m-(m>>1);sum[rt<<1|1]=(m>>1);}elsesum[rt<<1]=sum[rt<<1|1]=0;lazy[rt<<1]=lazy[rt<<1|1]=1;}void build(int l,int r,int rt)//建立线段树{lazy[rt]=1;sum[rt]=0;if(l==r){return ;}int  m=(l+r)>>1;build(lson);build(rson);}int R;void query(int L,int c,int l,int r,int rt){if(c<=0)return ;if(L<=l&&r<=R&&lazy[rt])//在范围内  且全为空或者全为满{if(!sum[rt])//全为空{ans-=(r-l+1);sum[rt]=(r-l+1);if(ql<0)ql=l;qr=r;}else//如果全为满 不能插花 想要跳过 因此右的边界范围扩大{R+=(r-l+1);if(R>n)R=n;}return ;}if(lazy[rt])pushdown(rt,r-l+1);lazy[rt]=0;int  m=(l+r)>>1;if(L<=m)query(L,c,lson);if(R>m)query(L,c,rson);pushup(rt,r-l+1);}void update(int L,int R,int l,int r,int rt){if(L<=l&&r<=R){ans+=sum[rt];lazy[rt]=1;sum[rt]=0;return ;}if(lazy[rt])pushdown(rt,r-l+1);lazy[rt]=0;int  m=(l+r)>>1;if(L<=m)update(L,R,lson);if(R>m) update(L,R,rson);pushup(rt,r-l+1);}int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);build(1,n,1);int a,b,c;while(m--){scanf("%d%d%d",&a,&b,&c);if(a==1){b++;ql=qr=-1;//左右两个花瓶R=b+c-1;query(b,c,1,n,1);if(qr>0)printf("%d %d\n",ql-1,qr-1);else  printf("Can not put any one.\n");}else{b++,c++;ans=0;update(b,c,1,n,1);printf("%d\n",ans);}}printf("\n");}return 0;}


原创粉丝点击