30 , 求条 , 玄关
查看原帖
30 , 求条 , 玄关
421291
Noble_Wolf楼主2024/3/26 16:55
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define debug cout<<"DS"<<endl
int re(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void file(){
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
const int N = 2e5+10;
struct node{
	int lmax,rmax,max,sum,siz,tag;
}t[2][N<<2];
int n,m;
void pushup(int p){
	for(int i=0;i<=1;i++){
		t[i][p].max=max(t[i][p<<1].max,max(t[i][p<<1|1].max,t[i][p<<1].rmax+t[i][p<<1|1].lmax));
		t[i][p].lmax=t[i][p<<1].lmax==t[i][p<<1].siz?t[i][p<<1].siz+t[i][p<<1|1].lmax:t[i][p<<1].lmax;
		t[i][p].rmax=t[i][p<<1|1].rmax==t[i][p<<1|1].siz?t[i][p<<1|1].siz+t[i][p<<1].rmax:t[i][p<<1|1].rmax;
		t[i][p].sum=t[i][p<<1|1].sum+t[i][p<<1].sum;
	}
}
void build(int p,int l,int r){
	t[0][p].siz=t[1][p].siz=r-l+1;
	if(l==r){
		t[1][p].sum=t[1][p].lmax=t[1][p].rmax=t[1][p].max=1;
		return;
	}
	int mid = l+r >> 1;
	build(p<<1,l,mid),build(p<<1|1,mid+1,r);
	pushup(p);
}
void upd(int p,int l,int r,int k){
	t[k][p].tag=1;
	t[k][p].lmax=t[k][p].rmax=t[k][p].max=t[k][p].sum=r-l+1;
	t[k^1][p]={0,0,0,0,r-l+1,0};
}
void pushdown(int p,int l,int r){
	for(int i=0;i<=1;i++){
		if(t[i][p].tag){
			int mid = l+r >> 1;
			upd(p<<1,l,mid,i),upd(p<<1|1,mid+1,r,i);
			t[i][p].tag=0;
		}
	}
}
void update(int p,int l,int r,int x,int y,int k){//l~r  k
	if(l>=x&&r<=y){
		upd(p,l,r,k);
		return;
	}
	int mid = l+r >> 1;
	pushdown(p,l,r);
	if(x<=mid)update(p<<1,l,mid,x,y,k);
	if(y>mid)update(p<<1|1,mid+1,r,x,y,k);
	pushup(p);
}
int query(int p,int l,int r,int x,int y,int op){
	if(l>=x&&r<=y){
		return t[op][p].sum;
	}
	int res=0;
	int mid = l+r >> 1;
	pushdown(p,l,r);
	if(x<=mid)res+=query(p<<1,l,mid,x,y,op);
	if(y>mid)res+=query(p<<1|1,mid+1,r,x,y,op);
	return res;
}
int find(int p,int l,int r,int x,int y,int k){//第k个0 
	if(l==r)return l;
	int mid = l+r >> 1;
	pushdown(p,l,r);
	int lsum=t[0][p<<1].sum;
	if(lsum>=k)return find(p<<1,l,mid,x,y,k);
	else return find(p<<1|1,mid+1,r,x,y,k-lsum);
}
int Query(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y){
		return t[0][p].max;
	}
	int res=-1;
	pushdown(p,l,r);
	int mid = l+r >> 1;
	if(x<=mid)res=max(Query(p<<1,l,mid,x,y),res);
	if(y>mid)res=max(res,Query(p<<1|1,mid+1,r,x,y));
	if(x<=mid&&y>mid)res=max(res,min(mid-x+1,t[0][p<<1].rmax)+min(y-mid,t[0][p<<1|1].lmax));
	return res;
}
int main(){
	n=re(),m=re();
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op=re(),l=re(),r=re();
		if(op==0){
			update(1,1,n,l,r,0);
		}
		else if(op==1){
			int L=re(),R=re();
			int Sum=query(1,1,n,l,r,1);//1的数量 
			if(Sum==0)continue;
			update(1,1,n,l,r,0);
			int S=query(1,1,n,L,R,0);
			if(S==0)continue;
			if(S<=Sum)update(1,1,n,L,R,1);
			else{
				int id=find(1,1,n,L,R,Sum);//第k个0坐标 
				update(1,1,n,L,id,1);
			}
		}
		else{
			cout<<Query(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}

2024/3/26 16:55
加载中...