萌新 hack 数据和样例过了,数据一个也没过求调
查看原帖
萌新 hack 数据和样例过了,数据一个也没过求调
723238
wukaichen888楼主2023/1/19 12:22
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,a[N];
struct node{
	int len,sum0,sum1,lmax0,rmax0,maxx0,lmax1,rmax1,maxx1;
	bool tag1,tag2,tag3;
}tree[N<<2];
#define k1 k<<1
#define k2 k<<1|1
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
void add(int k,int l,int r,int d){
	if(!d){
		tree[k].tag1=1;
		tree[k].tag2=tree[k].tag3=0;
		tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=tree[k].len;
		tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=0;
	}
	if(d==1){
		tree[k].tag2=1;
		tree[k].tag1=tree[k].tag3=0;
		tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=0;
		tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=tree[k].len;
	}
	if(d==2){
		tree[k].tag3^=1;
		swap(tree[k].sum0,tree[k].sum1);
		swap(tree[k].lmax0,tree[k].lmax1);
		swap(tree[k].rmax0,tree[k].rmax1);
		swap(tree[k].maxx0,tree[k].maxx1);
	}
}
void pushdown(int k,int l,int r){
	int mid=(l+r)>>1;
	if(tree[k].tag1){
		add(ls,0);
		add(rs,0);
		tree[k].tag1=0;
	}
	if(tree[k].tag2){
		add(ls,1);
		add(rs,1);
		tree[k].tag2=0;
	}
	if(tree[k].tag3){
		add(ls,2);
		add(rs,2);
		tree[k].tag3=0;
	}
}
node pushup(node x,node y){
	node z;
	z.len=x.len+y.len;
	z.sum0=x.sum0+y.sum0;
	z.sum1=x.sum1+y.sum1;
	z.lmax0=x.lmax0;
	if(x.sum0==x.len)
		z.lmax0=x.len+y.lmax0;
	z.lmax1=x.lmax1;
	if(x.sum1==x.len)
		z.lmax1=x.len+y.lmax1;
	z.rmax0=y.rmax0;
	if(y.sum0==y.len)
		z.rmax0=y.len+x.rmax0;
	z.rmax1=y.rmax1;
	if(y.sum1==y.len)
		z.rmax1=y.len+x.rmax1;
	z.maxx0=x.rmax0+y.lmax0;
	z.maxx1=x.rmax1+y.lmax1;
	z.tag1=z.tag2=z.tag3=0;
	return z;
}
void pre(int k,int l,int r){
	tree[k].len=r-l+1;
	if(l==r){
		add(k,l,r,a[l]);
		return ;
	}
	int mid=(l+r)>>1;
	pre(ls);
	pre(rs);
	tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
void change1(int k,int l,int r,int x,int y,int d){
	if(x<=l&&r<=y){
		add(k,l,r,d);
		return ;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,r);
	if(x<=mid)
		change1(ls,x,y,d);
	if(mid<y)
		change1(rs,x,y,d);
	tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
node query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)
		return tree[k];
	int mid=(l+r)>>1;
	pushdown(k,l,r);
	if(x<=mid&&mid<y)
		return pushup(query(ls,x,y),query(rs,x,y));
	if(x<=mid)
		return query(ls,x,y);
	if(mid<y)
		return query(rs,x,y);
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	pre(1,1,n);
	int op,x,y;
	while(q--){
		scanf("%d%d%d",&op,&x,&y);
		x++,y++;
		if(op<3)
			change1(1,1,n,x,y,op);
		else
			if(op==3)
				printf("%d\n",query(1,1,n,x,y).sum1);
			else
				if(op==4) 
					printf("%d\n",query(1,1,n,x,y).maxx1);
	}
	return 0;
}
2023/1/19 12:22
加载中...