Vases and Flowers
2014-10-01 16:02
211 查看
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.二分就是一件神器啊。注意一些细节的处理。
View Code
题意:给你n个花瓶,然后有两种操作:1从a开始选择b个花瓶,放进花,输出左端点,右端点
2把a到b之间的花瓶中的花拿走,输出拿走的花的数目。
题解:一看数据范围就知道是线段树,sum维护区间空的花瓶的个数,flag作为lazy标记,如果flag==1表示清空,flag==0表示填满。这一题重要的地方就是二分。
二分找左边的端点,二分找右边的端点。这是这一题的关键,复杂度就是M*logN*logN.二分就是一件神器啊。注意一些细节的处理。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=5e4+100; int sum[N*4],flag[N*4]; int n,m; void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt){ sum[rt]=0; flag[rt]=-1; if(l==r){ sum[rt]=1; return; } int mid=(l+r)/2; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushup(rt); } void pushdown(int l,int r,int rt){ if(flag[rt]==1){ flag[rt<<1]=flag[rt<<1|1]=1; sum[rt<<1]=l; sum[rt<<1|1]=r; flag[rt]=-1; } if(flag[rt]==0){ flag[rt<<1]=flag[rt<<1|1]=0; sum[rt<<1]=0; sum[rt<<1|1]=0; flag[rt]=-1; } } int query(int l,int r,int rt,int from,int to){ if(l==from&&r==to){ return sum[rt]; } int mid=(l+r)/2; pushdown(mid-l+1,r-mid,rt); if(mid>=to)return query(l,mid,rt<<1,from,to); else if(mid<from)return query(mid+1,r,rt<<1|1,from,to); else{ return query(l,mid,rt<<1,from,mid)+query(mid+1,r,rt<<1|1,mid+1,to); } } void update(int l,int r,int rt,int from,int to,int val){ if(l==from&&r==to){ flag[rt]=val; sum[rt]=val*(r-l+1); return; } int mid=(l+r)/2; pushdown(mid-l+1,r-mid,rt); if(mid>=to) update(l,mid,rt<<1,from,to,val); else if(mid<from) update(mid+1,r,rt<<1|1,from,to,val); else{ update(l,mid,rt<<1,from,mid,val); update(mid+1,r,rt<<1|1,mid+1,to,val); } pushup(rt); } int main(){ int T,k,a,b,from,to; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); build(1,n,1); for(int i=1;i<=m;i++){ scanf("%d%d%d",&k,&a,&b); if(k==1){ from=a+1,to=n; int temp=query(1,n,1,a+1,n); if(temp==0){ printf("Can not put any one.\n"); } else{ b=min(b,temp); int l=a+1,r=n; while(l<=r){ int mid=(l+r)/2; if(query(1,n,1,a+1,mid)>0){ from=mid; r=mid-1; } else{ l=mid+1; } } l=from,r=n; while(l<=r){ int mid=(l+r)/2; if(query(1,n,1,from,mid)>=b){ to=mid; r=mid-1; } else{ l=mid+1; } } printf("%d %d\n",from-1,to-1); update(1,n,1,from,to,0); } } else{ printf("%d\n",b-a+1-query(1,n,1,a+1,b+1)); update(1,n,1,a+1,b+1,1); } } puts(""); } }
View Code
相关文章推荐
- Vases and Flowers - HDU 4614 - 线段树
- hdu 4614 Vases and Flowers(线段树)
- hdu 4614 Vases and Flowers(线段树+二分)
- HDU 4614 Vases and Flowers(成端更新 求和 + 二分)转自网络
- hdu 4614 Vases and Flowers(线段树:成段更新)
- L - Vases and Flowers - hdu 4614(区间操作)
- hdu 4614 Vases and Flowers(线段树+二分)
- hdu-4614-Vases and Flowers-线段树
- hdu 4614 Vases and Flowers(线段树+二分)
- hdu4614 Vases and Flowers(线段树+二分)
- HDU 4614 Vases and Flowers(线段树区间更新+二分)
- hdu4614 Vases and Flowers
- HDU 4614 Vases and Flowers
- HDU 4614 Vases and Flowers
- hdu 4614 Vases and Flowers(线段树+二分)
- hdu 4614 Vases and Flowers(线段树)
- HDU4614-Vases and Flowers
- HDU 4614 Vases and Flowers(线段树+二分)
- hdu 4614 Vases and Flowers(线段树+二分)
- Vases and Flowers(线段树+二分+区间修改区间查询)