hdu 4614——Vases and Flowers

线段树

线段树太渣了,看别人代码恶补下。http://www.cnblogs.com/aukle/archive/2013/07/26/3217639.html

#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 50010
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((t[rt].l+t[rt].r)>>1)
//注意加括号!! 
int n,m;
struct tree
{
    int l,r;
    int sum;
    int lazy;
}t[maxn<<2];
void pushup(int rt)
{
	t[rt].sum=t[ls].sum+t[rs].sum;
}
void pushdown(int rt)
{
	if(t[rt].lazy==0)
	{
		t[rt].lazy=-1;
		t[ls].sum=0;
		t[rs].sum=0;
		t[ls].lazy=0;
		t[rs].lazy=0;
	}
	else if(t[rt].lazy==1)
	{
		t[rt].lazy=-1;
		t[ls].sum=t[ls].r-t[ls].l+1;
		t[rs].sum=t[rs].r-t[rs].l+1;
		t[ls].lazy=1;
		t[rs].lazy=1;
	}
}
void build(int rt,int l,int r)
{
	t[rt].sum=1,t[rt].l=l,t[rt].r=r,t[rt].lazy=-1;
	if(l==r)
		return;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(rt);
}
int query(int rt,int l,int r)
{

	if(t[rt].l==l&&t[rt].r==r)
		return t[rt].sum;
	pushdown(rt);
	if(l>mid)
		return query(rs,l,r);
	else
		if(r<=mid)
			return query(ls,l,r);
		else
			return query(ls,l,mid)+query(rs,mid+1,r);
}
void change(int rt,int l,int r,int val)
{
	if(t[rt].l==l&&t[rt].r==r)
	{
		if(val==0)
			t[rt].sum=0;
		else
			t[rt].sum=r-l+1;		
		t[rt].lazy=val;
		return ;
	}
	pushdown(rt);
	if(l>mid)
		change(rs,l,r,val);
	else
		if(r<=mid)
			change(ls,l,r,val);
		else
			change(ls,l,mid,val),change(rs,mid+1,r,val);
	pushup(rt);
}
int main()
{
	int t;
	int x,a,b;
	cin>>t;
	while(t--)
	{
		scanf("%d%d",&n,&m);
		build(1,0,n-1);
		while(m--)
		{
			scanf("%d%d%d",&x,&a,&b);
			if(x==1)
			{
				int sum=query(1,a,n-1);
				if(sum==0)
					printf("Can not put any one.\n");
				else
				{
					if(sum<b)
						b=sum;
					int s,e;
					int l=a,r=n-1;
					int m;
					while(l<=r)
					{
						m=(l+r)>>1;
						if(query(1,a,m)>=1)
						{
							s=m;
							r=m-1;
						}
						else
							l=m+1;
					}
					l=a,r=n-1;
					while(l<=r)
					{
						m=(l+r)>>1;
						if(query(1,a,m)>=b)
						{
							e=m;
							r=m-1;
						}
						else
							l=m+1;
					}
					change(1,s,e,0);
					printf("%d %d\n",s,e);
				}	
			}
			else
			{
				
				printf("%d\n",b-a+1-query(1,a,b));
				change(1,a,b,1);
			}	
		}
		printf("\n");
	}
	return 0;
} 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值