答案不对
查看原帖
答案不对
786154
zhanxiangkun楼主2024/10/2 18:31
#include <bits/stdc++.h>
using namespace std;
int n, m;

struct house{
	int l, r, sum, lmax, rmax, tag;	 
}tree[200001];

void build(int p,int l,int r){
	tree[p].l=l; tree[p].r=r;
	tree[p].sum=r-l+1; tree[p].lmax=r-l+1;
	tree[p].rmax=r-l+1; tree[p].tag=0;
	if (l==r) return ;
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
}

void spread(int x){
	if (!tree[x].tag) return ;
	if (tree[x].tag == 1){
		tree[x<<1].tag = tree[x<<1|1].tag = 1;
		tree[x<<1].sum=tree[x<<1].lmax=tree[x<<1].rmax=0;
		tree[x<<1|1].sum=tree[x<<1|1].lmax=tree[x<<1|1].rmax=0;
	}
	if (tree[x].tag == 2){
		tree[x<<1].tag = tree[x<<1|1].tag = 2;
		tree[x<<1].sum=tree[x<<1].lmax=tree[x<<1].rmax=tree[x<<1].r-tree[x<<1].l+1;
		tree[x<<1|1].sum=tree[x<<1|1].lmax=tree[x<<1|1].rmax=tree[x<<1|1].r-tree[x<<1|1].l+1;
	}
	tree[x].tag=0;
}

void renew(int x){
	if (tree[x<<1].r-tree[x<<1].l+1 == tree[x<<1].sum) tree[x].lmax = tree[x<<1].sum + tree[x<<1|1].lmax;
	else tree[x].lmax=tree[x<<1].lmax;
	if (tree[x<<1|1].r-tree[x<<1|1].l+1 == tree[x<<1|1].sum) tree[x].rmax = tree[x<<1|1].sum + tree[x<<1].rmax;
	else tree[x].rmax=tree[x<<1|1].rmax;
	tree[x].sum = max(max(tree[x<<1].sum,tree[x<<1|1].sum),tree[x<<1].rmax+tree[x>>1|1].lmax);
}

void change(int p,int l,int r,int tag,int L,int R){
	spread(p);
	if (l >= L && r <= R){
		if (tag == 1){
			tree[p].sum=tree[p].lmax=tree[p].rmax=0;
		}
		if (tag == 2){
			tree[p].sum=tree[p].lmax=tree[p].rmax=tree[p].r-tree[p].l+1;
		}
		tree[p].tag = tag;
		return ;
	}
	int mid=l+r>>1;
	if (L <= mid) change(p<<1,l,mid,tag,L,R);
	if (R > mid) change(p<<1|1,mid+1,r,tag,L,R);
	renew(p);
}

int query(int p,int l,int r,int lenth){
	spread(p);
	if (l==r) return l;
	int num1 = tree[p<<1].sum, num2 = tree[p<<1|1].sum, num3 = tree[p<<1].rmax+tree[p<<1|1].lmax;
	int mid = l+r>>1;
	if (num1 >= lenth) return query(p<<1,l,mid,lenth);
	else if (num3 >= lenth) return mid - tree[p<<1].rmax + 1;
	else return query(p<<1|1,mid+1,r,lenth);
}

int main(){
	cin >> n >> m;
	build(1,1,n);
	for (int i = 0;i < m;i ++){
		int op;
		cin >> op;
		if (op == 1){
			int le;
			cin >> le;
			if (tree[1].sum < le) cout << 0 << endl;
			else{
				int l = query(1,1,n,le);
				cout << l << endl;
				change(1,1,n,1,l,l+le-1);
			}
		} 
		if (op == 2){
			int a,b;
			cin >> a;
			cin >> b;
			change(1,1,n,2,a,a+b-1);
		}
	}
	return 0;
}
2024/10/2 18:31
加载中...