描述
n个位置,初始为0,m个操作操作,两种,一:给定x,y,从x位置开始向右选则y个空位置,这些位置置1,空位置不足则最多到n位置结束即可,输出放置的最左端和最右段,一个也不能放就输出“Can not put any one.”;二:清空x~y区间,输出区间内非空位置个数。
分析
每次操作的区间是x~n,update(int k,int l)。当前区间在范围内、且全空、且长度小于等于y,则当前区间更新为全1,y -= 长度。
代码
//题目要求编号为0~n-1
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<queue>
#include<vector>
#define cl (k<<1)
#define cr (k<<1|1)
#define Mid ((a[k].l+a[k].r)>>1)
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
#define bug printf("???\n")
typedef long long LL;
const int Inf=0x3f3f3f3f;
const double eps=1e-7;
const int maxn=50050;
struct N{
int l,r;
int sum,lz;
}a[maxn*4];
void build(int k,int l,int r){
a[k].l=l, a[k].r=r;
a[k].sum = 0;
a[k].lz = -1;
if(l==r) return;
build(cl,l,Mid);
build(cr,Mid+1,r);
}
void down(int k){
a[cl].lz = a[cr].lz = a[k].lz;
a[cl].sum = (a[cl].r-a[cl].l+1)*a[k].lz;
a[cr].sum = (a[cr].r-a[cr].l+1)*a[k].lz;
a[k].lz = -1;
}
int getsum(int k,int l,int r){
if(l<=a[k].l&&a[k].r<=r) {
return a[k].sum;
}
if(a[k].lz!=-1) down(k);
int ret=0;
if(l<=Mid) ret += getsum(cl,l,r);
if(r> Mid) ret += getsum(cr,l,r);
return ret;
}
void setzero(int k,int l,int r){
if(l<=a[k].l&&a[k].r<=r) {
a[k].sum = 0;
a[k].lz = 0;
return;
}
if(a[k].lz!=-1) down(k);
if(l<=Mid) setzero(cl,l,r);
if(r> Mid) setzero(cr,l,r);
a[k].sum = a[cl].sum + a[cr].sum;
}
int L,R,Num;
void update(int k,int l){
if(a[k].sum==a[k].r-a[k].l+1 || Num==0) return;
if(l<=a[k].l && a[k].sum==0 && a[k].r-a[k].l+1<=Num){
L = min(L, a[k].l);
R = max(R, a[k].r);
a[k].sum = a[k].r-a[k].l+1;
a[k].lz = 1;
Num -= a[k].r-a[k].l+1;
return;
}
if(a[k].lz!=-1) down(k);
if(l<=Mid){
if(a[cl].sum < a[cl].r-a[cl].l+1) update(cl, l);
}
update(cr,l);
a[k].sum = a[cl].sum + a[cr].sum;
}
int main()
{
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
build(1,1,n);
int op,x,y;
for(int i=1; i<=m; i++){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
L = Inf, R = 0, Num = y;
update(1, x+1);
if(L==Inf) printf("Can not put any one.\n");
else printf("%d %d\n",L-1,R-1);
}
if(op==2){
printf("%d\n",getsum(1,x+1,y+1));
setzero(1,x+1,y+1);
}
}
printf("\n");
}
}