线段树求调
查看原帖
线段树求调
616733
Lysea楼主2024/6/25 15:19
#include<bits/stdc++.h>
#define int long long
#define N 1000005
#define INF 1e18
using namespace std;
struct tree{
	int l,r,lm,rm,v,lz;
}t[N<<1];
int n,m,op,a,b;
void push_up(int p){
	t[p].v=max(max(t[p<<1].v,t[p<<1|1].v),t[p<<1].rm+t[p<<1|1].lm);
	if(t[p].lm==(t[p<<1].r-t[p<<1].l+1))
		t[p].lm=t[p<<1].lm+t[p<<1|1].lm;
	else t[p].lm=t[p<<1].lm;
	if(t[p<<1|1].rm==(t[p<<1|1].r-t[p<<1|1].l+1))
		t[p].rm=t[p<<1|1].rm+t[p<<1].rm;
	else t[p].rm=t[p<<1|1].rm;
}
void push_down(int p){
	if(t[p].lz==-1) return;
	if(t[p].lz){
		t[p<<1].lm=t[p<<1].rm=t[p<<1].v=0;
		t[p<<1|1].lm=t[p<<1|1].rm=t[p<<1|1].v=0;	
	}else{
		t[p<<1].lm=t[p<<1].rm=t[p<<1].v=t[p<<1].r-t[p<<1].l+1;
		t[p<<1|1].lm=t[p<<1|1].rm=t[p<<1|1].v=t[p<<1|1].r-t[p<<1|1].l+1;
	}
	t[p<<1].lz=t[p<<1|1].lz=t[p].lz;
	t[p].lz=-1;
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r,t[p].lz=-1;
	t[p].lm=t[p].rm=t[p].v=t[p].r-t[p].l+1;
	if(l==r) return;
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
void change(int p,int l,int r,int v){
	push_down(p);
	if(t[p].l>=l&&t[p].r<=r){
		if(v){
			t[p].lm=t[p].rm=t[p].v=0;
			t[p].lz=1;
		}else{
			t[p].lm=t[p].rm=t[p].v=t[p].r-t[p].l+1;
			t[p].lz=0;
		}
		return;
	}
	
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) change(p<<1,l,r,v);
	if(r>mid) change(p<<1|1,l,r,v);
	push_up(p);
}
int query(int p,int x){
	push_down(p);
	if(t[p].l==t[p].r) return t[p].l;
	if(t[p<<1].v>=x) return query(p<<1,x);
	if(t[p<<1].rm+t[p<<1|1].lm>=x) return t[p<<1].r-t[p<<1].rm+1;
	if(t[p<<1|1].v>=x) return query(p<<1|1,x);
	return 0;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		cin>>op>>a;
		if(op==1){
			int k=query(1,a);
			cout<<k<<endl;
			if(k) change(1,k,k+a-1,1);
		}else{
			cin>>b;
			change(1,a,a+b-1,0);
		}
	}
	return 0;
}

样例都过不去。

2024/6/25 15:19
加载中...