标签:
2 10 5 1 3 5 2 4 5 1 1 8 2 3 6 1 8 8 10 6 1 2 5 2 3 4 1 0 8 2 2 5 1 4 4 1 2 3
3 7 2 1 9 4 Can not put any one. 2 6 2 0 9 4 4 5 2 3 线段树区间更新题目:操作一:(A,F),从A花瓶开始插花,可以不连续,将F朵花插到花瓶中。给出初末位置。操作二:(L,R),将区间中的花清除。计算区间中的花的朵数。操作一,由于是不连续,所以我们考虑两次二分找出初末位置来做。<pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; typedef pair<int,int>pil; const int maxn=50001+100; int col[maxn<<2],sum[maxn<<2];//lazy标记,col[i]=1表示空位,col[i]=0表示无空位,col[i]==-1表示全是空位 int t,n,m; void pushup(int rs) { sum[rs]=sum[rs<<1]+sum[rs<<1|1]; } void pushdown(int rs,int s) { if(col[rs]==0) { col[rs<<1]=col[rs<<1|1]=0; sum[rs<<1]=sum[rs<<1|1]=0; col[rs]=-1; } else if(col[rs]==1) { col[rs<<1]=col[rs<<1|1]=1; sum[rs<<1]=(s-(s>>1)); sum[rs<<1|1]=(s>>1); col[rs]=-1; } } void build(int l,int r,int rs) { col[rs]=-1; sum[rs]=1; if(l==r) return ; int mid=(l+r)>>1; build(l,mid,rs<<1); build(mid+1,r,rs<<1|1); pushup(rs); } void update(int x,int y,int c,int l,int r,int rs) { if(l>=x&&r<=y) { col[rs]=c; if(c) sum[rs]=r-l+1;//为1表示空 else sum[rs]=0; return ; } int mid=(l+r)>>1; pushdown(rs,r-l+1); if(x<=mid) update(x,y,c,l,mid,rs<<1); if(y>mid) update(x,y,c,mid+1,r,rs<<1|1); pushup(rs); } int query(int x,int y,int l,int r,int rs) { if(l>=x&&r<=y) return sum[rs]; int mid=(l+r)>>1; pushdown(rs,r-l+1); int res=0; if(x<=mid) res+=query(x,y,l,mid,rs<<1); if(y>mid) res+=query(x,y,mid+1,r,rs<<1|1); pushup(rs); return res; } int main() { int op,l,r; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); build(0,n-1,1); while(m--) { scanf("%d%d%d",&op,&l,&r);//A--F if(op==1) { int ans=query(l,n-1,0,n-1,1); if(ans==0)//若没有位置了,输出。。 puts("Can not put any one."); else { if(ans<r) r=ans; int ll=l,rr=n-1;//二分初末位置 while(ll<=rr) { int mid=(ll+rr)>>1; if(query(l,mid,0,n-1,1)>=1) rr=mid-1; else ll=mid+1; } int a=ll; ll=l;rr=n-1; while(ll<=rr) { int mid=(ll+rr)>>1; if(query(l,mid,0,n-1,1)>=r) rr=mid-1; else ll=mid+1; } int b=ll; update(a,b,0,0,n-1,1); printf("%d %d\n",a,b); } } else { printf("%d\n",r-l+1-query(l,r,0,n-1,1)); update(l,r,1,0,n-1,1); } } puts(""); } return 0; }
HDU 4614 Vases and Flowers(线段树区间更新+二分)
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/42834093