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]
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
using namespace std;
struct node
{
int l,r,flower;
bool flag;
}tree[50001<<2];
void create(int l,int r,int k)
{
tree[k].l=l;
tree[k].r=r;
tree[k].flower=0;
tree[k].flag=0;
if(l==r)
return;
int m=(l+r)>>1;
create(l,m,k<<1);
create(m+1,r,k<<1|1);
}
int discard;
void update(int l,int r,int k,bool flag)
{
if(l==tree[k].l&&r==tree[k].r)
{
if(flag)
tree[k].flower=r-l+1;
else
{
discard+=tree[k].flower;
tree[k].flower=0;
}
tree[k].flag=1;
return;
}
if(tree[k].flag)
{
tree[k].flag=0;
tree[k<<1].flag=tree[k<<1|1].flag=1;
if(tree[k].flower==0)
tree[k<<1].flower=tree[k<<1|1].flower=0;
else
{
tree[k<<1].flower=tree[k<<1].r-tree[k<<1].l+1;
tree[k<<1|1].flower=tree[k<<1|1].r-tree[k<<1|1].l+1;
}
}
int m=(tree[k].l+tree[k].r)>>1;
if(r<=m)
update(l,r,k<<1,flag);
else if(l>m)
update(l,r,k<<1|1,flag);
else
{
update(l,m,k<<1,flag);
update(m+1,r,k<<1|1,flag);
}
tree[k].flower=tree[k<<1].flower+tree[k<<1|1].flower;
}
int seek(int l,int r,int k)
{
if(l==tree[k].l&&r==tree[k].r)
return tree[k].flower;
if(tree[k].flag)
{
tree[k].flag=0;
tree[k<<1].flag=tree[k<<1|1].flag=1;
if(tree[k].flower==0)
tree[k<<1].flower=tree[k<<1|1].flower=0;
else
{
tree[k<<1].flower=tree[k<<1].r-tree[k<<1].l+1;
tree[k<<1|1].flower=tree[k<<1|1].r-tree[k<<1|1].l+1;
}
}
int m=(tree[k].l+tree[k].r)>>1;
if(r<=m)
return seek(l,r,k<<1);
else if(l>m)
return seek(l,r,k<<1|1);
else
return seek(l,m,k<<1)+seek(m+1,r,k<<1|1);
}
int n;
void add(int a,int b)
{
if(seek(a,n-1,1)==n-a)
{
puts("Can not put any one.");
return;
}
int l=a,r=n-1;
while(l<=r)
{
int m=(l+r)>>1;
if(m-a+1-seek(a,m,1)<1)
l=m+1;
else
r=m-1;
}
int x=l;
l=a;r=n-1;
while(l<=r)
{
int m=(l+r)>>1;
if(m-a+1-seek(a,m,1)<b)
l=m+1;
else
r=m-1;
}
int y=l;
if(y>n-1)
y=n-1;
int goal=y-x+1-seek(x,y,1);
l=x;r=y;
while(l<=r)
{
int m=(l+r)>>1;
if(m-x+1-seek(x,m,1)<goal)
l=m+1;
else
r=m-1;
}
y=l;
update(x,y,1,1);
printf("%d %d\n",x,y);
}
void clean(int l,int r)
{
discard=0;
update(l,r,1,0);
printf("%d\n",discard);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int m;
scanf("%d%d",&n,&m);
create(0,n-1,1);
while(m--)
{
int k,a,b;
scanf("%d%d%d",&k,&a,&b);
if(k==1)
add(a,b);
else
clean(a,b);
}
puts("");
}
}原文:http://blog.csdn.net/stl112514/article/details/43128507