【玄关】线段树求调
查看原帖
【玄关】线段树求调
659165
mysterys楼主2024/5/27 21:21

rtrt,有事踹我

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N=500005;
int n,m,ans;
namespace T{
	struct node{
		int l,r,lzy;
		int lmax[2];
	}t[N<<2];
	inline void up(int u){
		const int ls=u<<1,rs=u<<1|1;//const 卡常
		if(t[ls].lmax[0]==t[ls].r-t[ls].l+1){
			t[u].lmax[0]=t[ls].lmax[0]+t[rs].lmax[0];
		}else if(t[ls].lmax[0]==0){
			t[u].lmax[0]=0;
			t[u].lmax[1]=t[u].lmax[1]+t[u].lmax[1];
		}else{
			t[u].lmax[0]=t[ls].lmax[0];
			t[u].lmax[1]=0;
		}
	}
	inline void down(int u){
		const int ls=u<<1,rs=u<<1|1;
		if(t[u].lzy==-1) return;
		if(t[u].lzy==0){
			t[ls].lzy=t[rs].lzy=0;
			t[ls].lmax[0]=t[ls].r-t[ls].l+1;
			t[ls].lmax[1]=0;
			t[rs].lmax[0]=t[rs].r-t[rs].l+1;
			t[rs].lmax[1]=0;
		}else{
			t[ls].lzy=t[rs].lzy=1;
			t[ls].lmax[1]=t[ls].r-t[ls].l+1;
			t[ls].lmax[0]=0;
			t[rs].lmax[1]=t[rs].r-t[rs].l+1;
			t[rs].lmax[0]=0;
		}
	}
	inline void build(int u,int l,int r){
		t[u].l=l;t[u].r=r;t[u].lzy=-1;
		if(l==r) {
			t[u].lmax[0]=1;t[u].lmax[1]=0;
			return;
		}
		int m=(l+r)>>1;
		build(u<<1,l,m);build(u<<1|1,m+1,r);
		up(u);
	}
	inline void upd(int u,int l,int r,int opt){
		if(t[u].l>=l&&t[u].r<=r){
			if(t[u].lzy==-1) {
				t[u].lzy=opt;
				if(t[u].lzy==1){
					t[u].lmax[0]=0;
					t[u].lmax[1]=t[u].r-t[u].l+1;
				}else{
					t[u].lmax[1]=0;
					t[u].lmax[0]=t[u].r-t[u].l+1;
				}
			}else{
				t[u].lzy^=1;
				if(t[u].lzy==1){
					t[u].lmax[0]=0;
					t[u].lmax[1]=t[u].r-t[u].l+1;
				}else{
					t[u].lmax[1]=0;
					t[u].lmax[0]=t[u].r-t[u].l+1;
				}
			}
			return;
		}
		down(u);
		int m=(t[u].l+t[u].r)>>1;
		if(l<=m) upd(u<<1,l,r,opt);
		if(r>m) upd(u<<1|1,l,r,opt);
		up(u);
	}
	inline void ask(int u,int l,int r){
		if(t[u].l>=l&&t[u].r<=r){
			return ;
		}
		down(u);
		int m=(t[u].l+t[u].r)+1;
		if(l<=m) ask(u<<1,l,r);
		if(r>m) ask(u<<1|1,l,r);
		up(u);
	}
}
signed main(){
//	freopen("operation.in","r",stdin);
//	freopen("operation.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	T::build(1,1,n);
	while(m--){
		char opt;
		cin>>opt;
		if(opt=='A'){
			int x;
			cin>>x;
			T::ask(1,1,x);
			if(x>T::t[1].lmax[0]){
				++ans;
			}else{
				T::upd(1,1,x,1);
			}
		}else{
			int l,r;
			cin>>l>>r;
			T::upd(1,l,r,0);
		}
	}
	cout<<ans;
	return 0;
}
2024/5/27 21:21
加载中...