线段树 92pts 求调
查看原帖
线段树 92pts 求调
515129
TLEWA楼主2024/9/29 19:22
#include<bits/stdc++.h>

using namespace std;

const int N=50005;

int n,m;

struct Node {int lmax,rmax,max,len;};
Node merge(Node a,Node b) {
	Node c;
	if(a.len==a.max) c.lmax=a.max+b.lmax;
	else c.lmax=a.lmax;
	if(b.len==b.max) c.rmax=a.rmax+b.max;
	else c.rmax=b.rmax;
	c.max=max({c.lmax,c.rmax,a.max,b.max,a.rmax+b.lmax});
	c.len=a.len+b.len;
	return c;
}

struct Tre {
	int l,r;
	Node node;
	int tag;
}tre[4*N];

#define mid (tre[now].l+tre[now].r>>1)
#define lson (now*2)
#define rson (now*2+1)

void clear(int now,int tag) {
	int siz=tre[now].r-tre[now].l+1;
	if(tag==1) tre[now].node={siz,siz,siz,siz};
	else if(tag==2) tre[now].node={0,0,0,siz};
}

void pushdown(int now) {
	if(tre[now].tag) {
		clear(now,tre[now].tag);
		if(tre[now].l!=tre[now].r) tre[lson].tag=tre[rson].tag=tre[now].tag;
		tre[now].tag=0;
	}
}

void pushup(int now) {
	pushdown(now);
	if(tre[now].l==tre[now].r) return;
	pushdown(lson);pushdown(rson);
	tre[now].node=merge(tre[lson].node,tre[rson].node);
}

void build(int now,int l,int r) {
	tre[now].l=l,tre[now].r=r;
	clear(now,1);
	if(l==r) return;
	build(lson,l,mid);build(rson,mid+1,r);
}

int query(int now,int x) {
	pushdown(now);
	if(tre[now].l==tre[now].r) return tre[now].l;
	if(tre[lson].node.max>=x) return query(lson,x);
	else if(tre[lson].node.rmax+tre[rson].node.lmax>=x) return mid-tre[lson].node.rmax+1;
	else return query(rson,x);
}

void change(int now,int l,int r,int op) {
	if(tre[now].l>r || tre[now].r<l) return;
	pushdown(now);
	if(tre[now].l>=l && tre[now].r<=r) {tre[now].tag=op;return;}
	change(lson,l,r,op);change(rson,l,r,op);
	pushup(now);
}

int main() {
	cin >> n >> m;
	
	build(1,1,n);
	
	int op,x,l,r;
	for(int i=1;i<=m;++i) {
		cin >> op;
		if(op==1) {
			cin >> x;
			if(tre[1].node.max>=x) {
				int ans=query(1,x);
				cout << ans << endl;
				change(1,ans,ans+x-1,2); // 区间推平住人 
			}else cout << 0 << endl;
		}else {
			cin >> l >> r;
			change(1,l,l+r-1,1);
		}
	}
	
	return 0;
}

2024/9/29 19:22
加载中...