封装线段树 WA 20pts求调
查看原帖
封装线段树 WA 20pts求调
1046448
Polaris_flame楼主2024/11/19 20:15
#include<bits/stdc++.h>
#define FL(i,a,b) for(ll i=(a);i<=(b);i++)
#define FR(i,a,b) for(ll i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const ll MAXN = 5e5 + 10;
struct Segment_Tree{
	#define ls (x<<1)
	#define rs (x<<1|1)
	struct node{
		ll l,r,le,ri,as,tg;
		ll len(){
			return r-l+1;
		}
		void tag(ll x){
			tg=x;
			if(!x) le=ri=as=len();
			else le=ri=as=0;
		}
	}t[MAXN<<2];
	void Up(node &A,node B,node C){
		A.as=max({B.as,C.as,B.le+C.ri});
		A.le=(B.le==B.len())?B.len()+C.le:B.le;
		A.ri=(C.ri==C.len())?C.len()+B.ri:C.ri;
		A.as=max({A.as,A.le,A.ri});
	}
	void pushdown(ll x){
		if(t[x].tg!=-1){
			t[ls].tag(t[x].tg);
			t[rs].tag(t[x].tg);
		}
		t[x].tg=-1;
	}
	void build(ll x,ll l,ll r){
		t[x].l=l,t[x].r=r,t[x].tg=-1;
		t[x].le=t[x].ri=t[x].as=t[x].len();
		if(l==r) return ;
		ll mid=(l+r)>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		Up(t[x],t[ls],t[rs]);
	}
	void update(ll x,ll l,ll r,ll k){
		if(l<=t[x].l&&t[x].r<=r){
			t[x].tag(k);
			return ;
		}
		ll mid=(t[x].l+t[x].r)>>1;
		pushdown(x);
		if(l<=mid) update(ls,l,r,k);
		if(r>mid) update(rs,l,r,k);
		Up(t[x],t[ls],t[rs]);
	}
	ll query(ll x,ll k){
		pushdown(x);
		if(t[x].l==t[x].r) return t[x].l;
		ll mid=(t[x].l+t[x].r)>>1;
		if(t[ls].as>=k) return query(ls,k);
		else if(t[ls].ri+t[rs].le>=k) return mid-t[ls].ri+1;
		else return query(rs,k);
	}
	#undef ls
	#undef rs
}T;
signed main(){
	ll n,m,ans=0;
	scanf("%lld%lld",&n,&m);
	T.build(1,1,n);
	while(m--){
		char op;
		ll l,r;
		scanf(" %c%lld",&op,&l);
		if(op=='A'){
			if(T.t[1].as<l) ans++;
			else{
				ll pos=T.query(1,l);
				T.update(1,pos,pos+l-1,1);
			}
		}
		else{
			scanf("%lld",&r);
			if(l>r) swap(l,r);
			T.update(1,l,r,0);
		}
	}
	printf("%lld\n",ans);
}
2024/11/19 20:15
加载中...