分块0pts貌似操作四错了玄关求条
查看原帖
分块0pts貌似操作四错了玄关求条
1388711
wuhuhuhuhuhuhu楼主2024/10/24 17:16
#include<bits/stdc++.h>
using namespace std;
struct kuai {
	long long zhi=0;
	long long l=0;
	long long r=0;
	long long llian1=0;
	long long rlian1=0;
	long long lian1=0;
	long long llian0=0;
	long long rlian0=0;
	long long lian0=0;
};
long long meikuai;
kuai block[1000005];
long long c[1000005];
long long lan[1000005];
vector<long long> lan0(1000005,2);
inline long long getkuai(long long x) {
	return (x-1)/meikuai+1;
}
inline void push(long long x) {
	for(long long n=block[x].l; n<=block[x].r; n++) {
		if(lan0[x]==2) c[n]=(c[n]^lan[x]);
		else if(lan0[x]==0) c[n]=(c[n]&lan0[x]);
		else if(lan0[x]==1) c[n]=(c[n]|lan0[x]);
	}
	lan0[x]=2;
	lan[x]=0;
}
inline void weihu(long long x) {
	push(x);
	long long cnt=0;
	for(long long i=block[x].l; i<=block[x].r; i++) {
		if(c[i]==1) {
			block[x].lian0=max(block[x].lian0,cnt);
			cnt=0;
		} else cnt++;
	}
	block[x].lian0=max(block[x].lian0,cnt);
	cnt=0;
	for(long long i=block[x].l; i<=block[x].r; i++) {
		if(c[i]==0) {
			block[x].lian1=max(block[x].lian1,cnt);
			cnt=0;
		} else cnt++;
	}
	block[x].lian1=max(block[x].lian1,cnt);
	cnt=0;
	long long f0=0,f1=0,cnt1=0;
	for(long long i=block[x].l; i<=block[x].r; i++) {
		if(c[i]==0) {
			if(f0==0) cnt++;
			block[x].llian1=max(block[x].llian1,cnt1);
			cnt1=0;
			f1=1;
		}
		if(c[i]==1) {
			if(f1==0) cnt1++;
			block[x].llian0=max(block[x].llian0,cnt);
			cnt=0;
			f0=1;
		}
		if(f0==1&&f1==1) break;
	}
	block[x].llian1=max(block[x].llian1,cnt1);
	block[x].llian0=max(block[x].llian0,cnt);
	f0=0,f1=0,cnt1=0,cnt=0;
	for(long long i=block[x].r; i>=block[x].l; i--) {
		if(c[i]==0) {
			if(f0==0) cnt++;
			block[x].rlian1=max(block[x].rlian1,cnt1);
			cnt1=0;
			f1=1;
		}
		if(c[i]==1) {
			if(f1==0) cnt1++;
			block[x].rlian0=max(cnt,block[x].rlian0);
			cnt=0;
			f0=1;
		}
		if(f0==1&&f1==1) break;
	}
	block[x].rlian1=max(block[x].rlian1,cnt1);
	block[x].rlian0=max(cnt,block[x].rlian0);
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	long long a,b;
	cin>>a>>b;
	for(long long i=1; i<=a; i++) {
		cin>>c[i];
	}
	meikuai=(long long)sqrt(a);
	long long sum=0,cnt=1;
	for(long long i=1; i<=a; i++) {
		sum+=c[i];
		if(i%meikuai==0) {
			block[cnt].zhi=sum;
			block[cnt].l=block[cnt-1].r+1;
			block[cnt].r=i;
			sum=0;
			weihu(cnt);
			cnt++;
		}
	}
	if(a%((long long)sqrt(a))!=0) {
		block[cnt].zhi=sum;
		block[cnt].l=block[cnt-1].r+1;
		block[cnt].r=a;
	}
	weihu(cnt);
	long long ji;
	long long quel,quer,lid,rid;
	for(long long i=0; i<b; i++) {
		cin>>ji;
		cin>>quel>>quer;
		quel++;
		quer++;
		lid=getkuai(quel);
		rid=getkuai(quer);
		if(ji==0) {
			if(lid==rid) {
				for(long long n=quel; n<=quer; n++) {
					if(c[n]==1) {
						block[lid].zhi--;
						c[n]=0;
					}
				}
				weihu(lid);
			} else {
				for(long long n=quel; n<=block[lid].r; n++) {
					if(c[n]==1) {
						block[lid].zhi--;
						c[n]=0;
					}
				}
				weihu(lid);
				for(long long n=lid+1; n<rid; n++) {
					block[n].zhi=0;
					block[n].lian0=block[n].r-block[n].l+1;
					block[n].llian0=block[n].lian0;
					block[n].rlian0=block[n].lian0;
					block[n].lian1=0;
					block[n].llian1=0;
					block[n].rlian1=0;
					lan0[n]=0;
					lan[n]=0;
				}
				for(long long n=block[rid].l; n<=quer; n++) {
					if(c[n]==1) {
						block[rid].zhi--;
						c[n]=0;
					}
				}
				weihu(rid);
			}
		}
		if(ji==1) {
			if(lid==rid) {
				for(long long n=quel; n<=quer; n++) {
					if(c[n]==0) {
						block[lid].zhi++;
						c[n]=1;
					}
				}
				weihu(lid);
			} else {
				for(long long n=quel; n<=block[lid].r; n++) {
					if(c[n]==0) {
						block[lid].zhi++;
						c[n]=1;
					}
				}
				weihu(lid);
				for(long long n=lid+1; n<rid; n++) {
					lan0[n]=1;
					block[n].zhi=block[n].r-block[n].l+1;
					lan[n]=0;
					block[n].lian1=block[n].r-block[n].l+1;
					block[n].llian1=block[n].lian1;
					block[n].rlian1=block[n].lian1;
					block[n].lian0=0;
					block[n].llian0=0;
					block[n].rlian0=0;
				}
				for(long long n=block[rid].l; n<=quer; n++) {
					if(c[n]==0) {
						block[rid].zhi++;
						c[n]=1;
					}
				}
				weihu(rid);
			}
		}
		if(ji==2) {
			if(lid==rid) {
				for(long long n=quel; n<=quer; n++) {
					if(c[n]==0) {
						block[lid].zhi++;
						c[n]=1;
					} else if(c[n]==1) {
						block[lid].zhi--;
						c[n]=0;
					}
				}
				weihu(lid);
			} else {
				for(long long n=quel; n<=block[lid].r; n++) {
					if(c[n]==0) {
						block[lid].zhi++;
						c[n]=1;
					} else if(c[n]==1) {
						block[lid].zhi--;
						c[n]=0;
					}
				}
				weihu(lid);
				for(long long n=lid+1; n<rid; n++) {
					if(lan0[n]==2) lan[n]=lan[n]^1;
					else lan0[n]=lan0[n]^1;
					swap(block[n].lian0,block[n].lian1);
					swap(block[n].llian0,block[n].llian1);
					swap(block[n].rlian0,block[n].rlian1);
				}
				for(long long n=block[rid].l; n<=quer; n++) {
					if(c[n]==0) {
						block[rid].zhi++;
						c[n]=1;
					} else if(c[n]==1) {
						block[rid].zhi--;
						c[n]=0;
					}
				}
				weihu(rid);
			}
		}
		if(ji==3) {
			sum=0;
			if(lid==rid) {
				for(long long n=quel; n<=quer; n++) {
					if(lan0[lid]==2) sum+=(c[n]^lan[lid]);
					else if(lan0[lid]==0) sum+=(c[n]&lan0[lid]);
					else if(lan0[lid]==1) sum+=(c[n]|lan0[lid]);
				}
			} else {
				for(long long n=quel; n<=block[lid].r; n++) {
					if(lan0[lid]==2) sum+=(c[n]^lan[lid]);
					else if(lan0[lid]==0) sum+=(c[n]&lan0[lid]);
					else if(lan0[lid]==1) sum+=1;
				}
				for(long long n=lid+1; n<rid; n++) {
					if(lan0[n]==2) {
						if(lan[n]==1) sum+=block[n].r-block[n].l+1-block[n].zhi;
						else sum+=block[n].zhi;
					} else {
						if(lan0[n]==1) sum+=block[n].r-block[n].l+1;
					}
				}
				for(long long n=block[rid].l; n<=quer; n++) {
					if(lan0[rid]==2) sum+=(c[n]^lan[rid]);
					else if(lan0[rid]==0) sum+=(c[n]&lan0[rid]);
					else if(lan0[rid]==1) sum+=1;
				}
			}
			cout<<sum<<endl;
		}
		if(ji==4) {
			weihu(lid);
			sum=0;
			cnt=0;
			if(lid==rid) {
				for(long long n=quel; n<=quer; n++) {
					if(c[n]==0) {
						sum=max(sum,cnt);
						cnt=0;
					} else cnt++;
				}
				sum=max(sum,cnt);
			} else {
				weihu(rid);
				sum=max(min(block[lid].rlian1,block[lid].r-quel+1)+min(block[lid+1].llian1,quer-block[lid+1].l+1),sum);
				for(long long n=lid+1; n<rid-1; n++) {
					sum=max(block[n].rlian1+block[n+1].llian1,max(block[n].lian1,sum));
				}
				sum=max(block[rid-1].rlian1+min(quer-block[rid].l+1,block[rid].llian1),sum);
				sum=max(sum,block[rid-1].lian1);
			}
			cout<<sum<<endl;
		}
	}
	return 0;
}

2024/10/24 17:16
加载中...