标签:线段树
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
[pre]3 7 2 1 9 4 Can not put any one. 2 6 2 0 9 4 4 5 2 3 [/pre]
题意:n个花瓶,m个操作,1 表示从 le开始插入ri个花,if 没有空花瓶,输出一句话(下面),else输出插花起点和终点,2表示把le,到ri的花全部去掉
思路:二分花的起点和终点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
#define fre(i,a,b) for(i = a; i <b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 50001
struct stud{
int le,ri;
int lazy;
int len;
}f[N*4];
void pushdown(int pos)
{
if(f[pos].lazy==-1) return ;
if(f[pos].lazy)
{
f[L(pos)].len=f[L(pos)].ri-f[L(pos)].le+1;
f[R(pos)].len=f[R(pos)].ri-f[R(pos)].le+1;
}
else
{
f[L(pos)].len=f[R(pos)].len=0;
}
f[L(pos)].lazy=f[R(pos)].lazy=f[pos].lazy;
f[pos].lazy=-1;
}
void pushup(int pos)
{
f[pos].len=f[L(pos)].len+f[R(pos)].len;
}
void build(int pos,int le,int ri)
{
f[pos].le=le;
f[pos].ri=ri;
f[pos].len=ri-le+1;
f[pos].lazy=-1;
if(le==ri) return ;
int mid=MID(le,ri);
build(L(pos),le,mid);
build(R(pos),mid+1,ri);
}
void update(int pos,int le,int ri,int va)
{
if(f[pos].le==le&&f[pos].ri==ri)
{
if(va) f[pos].len=f[pos].ri-f[pos].le+1;
else f[pos].len=0;
f[pos].lazy=va;
return ;
}
pushdown(pos);
int mid=MID(f[pos].le,f[pos].ri);
if(mid>=ri)
update(L(pos),le,ri,va);
else
if(mid<le)
update(R(pos),le,ri,va);
else
{
update(L(pos),le,mid,va);
update(R(pos),mid+1,ri,va);
}
pushup(pos);
}
int query(int pos,int le,int ri)
{
if(f[pos].le==le&&f[pos].ri==ri)
return f[pos].len;
pushdown(pos);
int mid=MID(f[pos].le,f[pos].ri);
if(mid>=ri)
return query(L(pos),le,ri);
else
if(mid<le)
return query(R(pos),le,ri);
return query(L(pos),le,mid)+query(R(pos),mid+1,ri);
}
int main()
{
int i,j,op,t,n,k;
sf(t);
while(t--)
{
sff(n,k);
n--;
build(1,0,n);
int le,ri;
while(k--)
{
sfff(op,le,ri);
if(op==2)
{
pf("%d\n",ri-le+1-query(1,le,ri));
update(1,le,ri,1);
}
else
{
int len=query(1,le,n);
if(len==0)
{
pf("Can not put any one.\n");
continue;
}
len=min(len,ri);
int lle=le;
int rri=n;
int lans,rans;
while(lle<=rri) //二分左端点
{
int mid=MID(lle,rri);
if(query(1,le,mid)>0)
{
lans=mid;
rri=mid-1;
}
else
lle=mid+1;
}
lle=le;
rri=n;
while(lle<=rri) //二分右端点
{
int mid=MID(lle,rri);
int hello=query(1,le,mid);
if(hello>=len)
{
rans=mid;
rri=mid-1;
}
else
lle=mid+1;
}
pf("%d %d\n",lans,rans);
update(1,lans,rans,0);
}
}
pf("\n");
}
return 0;
}
HDU 4614 Vases and Flowers(线段树+二分)
标签:线段树
原文地址:http://blog.csdn.net/u014737310/article/details/44758733