线段树+二分的思想
二分出起点和终点 其他的线段树部分很简单
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
struct comp
{
int l,r,mid,x,lazy;
} data[300010];
void build(int l,int r,int k)
{
data[k].l=l;
data[k].r=r;
data[k].mid=(l+r)/2;
data[k].x=r-l+1;
data[k].lazy=-1;
if (l==r) return ;
build(l,data[k].mid,k*2);
build(data[k].mid+1,r,k*2+1);
}
void Pushdown(int k)
{
if (data[k].l==data[k].r || data[k].lazy==-1) return ;
data[k*2].lazy=data[k*2+1].lazy=data[k].lazy;
if (data[k].lazy==1)
{
data[k*2].x=data[k*2].r-data[k*2].l+1;
data[k*2+1].x=data[k*2+1].r-data[k*2+1].l+1;
}
else
data[k*2].x=data[k*2+1].x=0;
data[k].lazy=-1;
}
int search(int l,int r,int k)
{
if (data[k].l==l && data[k].r==r)
return data[k].x;
Pushdown(k);
if (r<=data[k].mid) return search(l,r,k*2);
else
if (l>data[k].mid) return search(l,r,k*2+1);
else
return search(l,data[k].mid,k*2)+search(data[k].mid+1,r,k*2+1);
}
void updata(int l,int r,int k,int op)
{
if (data[k].l==l && data[k].r==r)
{
if (op==0)
{
data[k].x=0;
data[k].lazy=0;
}
else
{
data[k].x=r-l+1;
data[k].lazy=1;
}
return ;
}
Pushdown(k);
if (r<=data[k].mid) updata(l,r,k*2,op);
else
if (l>data[k].mid) updata(l,r,k*2+1,op);
else
{
updata(l,data[k].mid,k*2,op);
updata(data[k].mid+1,r,k*2+1,op);
}
data[k].x=data[k*2].x+data[k*2+1].x;
}
int findstart(int l,int r)
{
int ll,rr,mid;
ll=l;
rr=r;
while (ll<=rr)
{
mid=(ll+rr)/2;
if (search(ll,mid,1)!=0) rr=mid-1;
else
if (search(mid,mid,1)==1) return mid;
else
ll=mid+1;
}
return ll;
}
int findend(int l,int r,int x)
{
int ll,rr,w,mid;
ll=l;
rr=r;
while (ll<=rr)
{
mid=(ll+rr)/2;
w=search(l,mid,1);
if (w<x) ll=mid+1;
else rr=mid-1;
}
return ll;
}
int main()
{
int Case,n,m,op,a,b,start,end,sum;
scanf("%d",&Case);
while (Case--)
{
scanf("%d%d",&n,&m);
build(0,n-1,1);
while (m--)
{
scanf("%d%d%d",&op,&a,&b);
if (op==1)
{
sum=search(a,n-1,1);
if (sum==0)
{
printf("Can not put any one.\n");
continue;
}
if (sum<b) b=sum;
start=findstart(a,n-1);
end=findend(start,n-1,b);
if (end==n) end--;
printf("%d %d\n",start,end);
updata(start,end,1,0);
}
else
{
sum=b-a+1-search(a,b,1);
printf("%d\n",sum);
updata(a,b,1,1);
}
}
printf("\n");
}
return 0;
}