样例和hack数据过了,求调
查看原帖
样例和hack数据过了,求调
1055892
xxxaIq楼主2024/12/5 20:57

题目的样例和 这里的所有hack 以及数据中的 hack 都过了,但是 WA 0pts求调。

//code by xxxalq
#include<bits/stdc++.h>
#define ll long long
#define mid ((t[p].l+t[p].r)/2)
using namespace std;

const int maxn=100003;

int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch>57||ch<48){
		if(ch==45){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>=48&&ch<=57){
		x=(x<<1)+(x<<3)+(ch-48);
		ch=getchar();
	}
	return x*f;
}

struct node{
	int l,r,v[2],sum,lv[2],rv[2],mk,qf;
}t[maxn<<2];

void pushup(int p){
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
	for(int i=0;i<2;i++){
		t[p].v[i]=max(max(t[p<<1].v[i],t[p<<1|1].v[i]),t[p<<1].rv[i]+t[p<<1|1].lv[i]);
		t[p].lv[i]=t[p<<1].lv[i];
		if(t[p<<1].lv[i]==mid-t[p].l+1){
			t[p].lv[i]+=t[p<<1|1].lv[i];
		}
		t[p].rv[i]=t[p<<1|1].rv[i];
		if(t[p<<1|1].rv[i]==t[p].r-mid){
			t[p].rv[i]+=t[p<<1].rv[i];
		}
	}
	return;
}

void pushdown(int p){
	if(t[p].mk){
		t[p].mk=0;
		t[p<<1].v[1]=t[p<<1].lv[1]=t[p<<1].rv[1]=0;
		t[p<<1|1].v[1]=t[p<<1|1].lv[1]=t[p<<1|1].rv[1]=0;
		t[p<<1].sum=t[p<<1|1].sum=0;
		t[p<<1].v[0]=t[p<<1].lv[0]=t[p<<1].rv[0]=mid-t[p].l+1;
		t[p<<1|1].v[0]=t[p<<1|1].lv[0]=t[p<<1|1].rv[0]=t[p].r-mid;
		t[p<<1].mk=t[p<<1|1].mk=1;
		t[p<<1].qf=t[p<<1|1].qf=0;
	}
	if(t[p].qf){
		t[p].qf=0;
		t[p<<1].sum=mid-t[p].l+1-t[p<<1].sum;
		swap(t[p<<1].lv[0],t[p<<1].lv[1]);
		swap(t[p<<1].rv[0],t[p<<1].rv[1]);
		swap(t[p<<1].v[0],t[p<<1].v[1]);
		t[p<<1|1].sum=t[p].r-mid-t[p<<1|1].sum;
		swap(t[p<<1|1].lv[0],t[p<<1|1].lv[1]);
		swap(t[p<<1|1].rv[0],t[p<<1|1].rv[1]);
		swap(t[p<<1|1].v[0],t[p<<1|1].v[1]);
		t[p<<1].qf^=1;
		t[p<<1|1].qf^=1;
	}
	return;
}

void update(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].sum=0;
		t[p].v[1]=t[p].lv[1]=t[p].rv[1]=0;
		int len=t[p].r-t[p].l+1;
		t[p].v[0]=t[p].lv[0]=t[p].rv[0]=len;
		t[p].qf=0;
		t[p].mk=1;
		return;
	}
	pushdown(p);
	if(l<=mid){
		update(p<<1,l,r);
	}
	if(r>mid){
		update(p<<1|1,l,r);
	}
	pushup(p);
	return;
}

void qufan(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].sum=t[p].r-t[p].l+1-t[p].sum;
		swap(t[p].lv[0],t[p].lv[1]);
		swap(t[p].rv[0],t[p].rv[1]);
		swap(t[p].v[0],t[p].v[0]);
		t[p].qf^=1;
		return;
	}
	pushdown(p);
	if(l<=mid){
		qufan(p<<1,l,r);
	}
	if(r>mid){
		qufan(p<<1|1,l,r);
	}
	pushup(p);
	return;
}

node query(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r){
		return t[p];
	}
	pushdown(p);
	if(l>mid){
		return query(p<<1|1,l,r);
	}
	if(r<=mid){
		return query(p<<1,l,r);
	}
	node res,resl=query(p<<1,l,r),resr=query(p<<1|1,l,r);
	res.sum=resl.sum+resr.sum;
	for(int i=0;i<2;i++){
		res.v[i]=max(max(resl.v[i],resr.v[i]),resl.rv[i]+resr.lv[i]);
		res.lv[i]=resl.lv[i];
		if(resl.lv[i]==min(mid-t[p].l+1,mid-l+1)){
			res.lv[i]+=resr.lv[i];
		}
		res.rv[i]=resr.rv[i];
		if(resr.rv[i]==min(r-mid,t[p].r-mid)){
			res.rv[i]+=resl.rv[i];
		}
	}
	return res;
}

int n,m,a[maxn];

void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].sum=a[l];
		for(int i=0;i<2;i++){
			t[p].v[i]=t[p].lv[i]=t[p].rv[i]=(a[l]==i);
		}
		return;
	}
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
//	cout<<p<<' '<<l<<" "<<r<<"\n";
//	for(int i=0;i<2;i++){
//		cout<<t[p].v[i]<<" "<<t[p].lv[i]<<" "<<t[p].rv[i]<<"\n";
//	}
//	cout<<"\n";
	return;
}

int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	while(m--){
		int op=read(),l=read()+1,r=read()+1;
		if(op==0){
			update(1,l,r);
		}else if(op==1){
			update(1,l,r);
			qufan(1,l,r);
		}else if(op==2){
			qufan(1,l,r);
		}else if(op==3){
			cout<<query(1,l,r).sum<<"\n";
		}else{
			cout<<query(1,l,r).v[1]<<"\n";
		}
//		for(int i=1;i<=n;i++){
//			cout<<query(1,i,i).sum<<" ";
//		}
//		cout<<"\n";
	}
	return 0;
}

2024/12/5 20:57
加载中...