悬关求调
  • 板块灌水区
  • 楼主0tAp
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/9/10 21:05
  • 上次更新2024/9/11 12:35:16
查看原帖
悬关求调
758858
0tAp楼主2024/9/10 21:05
#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
#define xx return
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e5+10;

int n,m;
int a[N];

struct Tree{
	int l,r;
	int sum,tag,rev;
	int max_n[2],lmax[2],rmax[2];
	#define l(x) t[x].l
	#define r(x) t[x].r
	#define sum(x) t[x].sum
	#define tag(x) t[x].tag
	#define siz(x) t[x].r-t[x].l+1
	#define rev(x) t[x].rev
	#define lmax(x,i) t[x].lmax[i]
	#define rmax(x,i) t[x].rmax[i]
	#define max_n(x,i) t[x].max_n[i] 
}t[N*4];

void push_up(int p)
{
	sum(p)=sum(p*2)+sum(p*2+1);
	rep(i,0,1)
	{
		lmax(p,i)=lmax(p*2,i);
		if((i==1&&sum(p*2)==siz(p*2))||(i==0&&sum(p*2)==0))
			lmax(p,i)+=lmax(p*2+1,i);
			
		rmax(p,i)=rmax(p*2+1,i);
		if((i==1&&sum(p*2+1)==siz(p*2+1))||(i==0&&sum(p*2+1)==0))
			rmax(p,i)+=rmax(p*2,i);
			
		max_n(p,i)=rmax(p*2,i)+lmax(p*2+1,i);
		max_n(p,i)=max(max_n(p,i),max_n(p*2,i));
		max_n(p,i)=max(max_n(p,i),max_n(p*2+1,i));
	}
}

void push_down(int p)
{
	if(tag(p)!=-1)
	{
		rev(p)=0;
		int val=tag(p);
		sum(p*2)=siz(p*2)*val;
		sum(p*2+1)=siz(p*2+1)*val;
		
		tag(p*2)=tag(p*2+1)=tag(p);
		rev(p*2)=rev(p*2+1)=0;
		
		max_n(p*2,val)=lmax(p*2,val)=rmax(p*2,val)=siz(p*2);
		max_n(p*2,val^1)=lmax(p*2,val^1)=rmax(p*2,val^1)=0;
		
		max_n(p*2+1,val)=lmax(p*2+1,val)=rmax(p*2+1,val)=siz(p*2+1);
		max_n(p*2+1,val^1)=lmax(p*2+1,val^1)=rmax(p*2+1,val^1)=0;
		
		tag(p)=-1;
	}
	if(rev(p)){
		sum(p*2)=siz(p*2)-sum(p*2);
		sum(p*2+1)=siz(p*2+1)-sum(p*2+1);
		
		if(tag(p*2)!=-1)tag(p*2)^=1;
		else rev(p*2)^=1;
		if(tag(p*2+1)!=-1)tag(p*2+1)^=1;
		else rev(p*2+1)^=1;
		
		swap(max_n(p*2,0),max_n(p*2,1));
		swap(lmax(p*2,0),lmax(p*2,1));
		swap(rmax(p*2,0),rmax(p*2,1));
		
		swap(max_n(p*2+1,0),max_n(p*2+1,1));
		swap(lmax(p*2+1,0),lmax(p*2+1,1));
		swap(rmax(p*2+1,0),rmax(p*2+1,1));
		
		rev(p)=0;
	}
}

void build(int p,int l,int r)
{
	l(p)=l,r(p)=r;
	tag(p)=-1;
	if(l==r){
		sum(p)=a[l];
		max_n(p,0)=lmax(p,0)=rmax(p,0)=(a[l]==0);
		max_n(p,1)=lmax(p,1)=rmax(p,1)=(a[l]==1);
		xx;
	}
	int mid=l+r>>1;
	build(p*2,l,mid),build(p*2+1,mid+1,r);
	push_up(p);
}

void change(int p,int L,int R,int id)
{
	push_down(p);
	if(L==l(p)&&r(p)==R){
		if(id==1||id==0){
			sum(p)=siz(p)*id;
			tag(p)=id;
			max_n(p,id)=lmax(p,id)=rmax(p,id)=siz(p);
			max_n(p,id^1)=lmax(p,id^1)=rmax(p,id^1)=0;
		}else{
			sum(p)=siz(p)-sum(p);
			rev(p)^=1;
			swap(max_n(p,0),max_n(p,1));
			swap(lmax(p,0),lmax(p,1));
			swap(rmax(p,0),rmax(p,1));
		}
		xx;
	}
	int mid=l(p)+r(p)>>1;
	if(mid<L)change(p*2+1,L,R,id);
	else if(R<=mid)change(p*2,L,R,id);
	else change(1,L,mid,id),change(1,mid+1,R,id);
	push_up(p);
}

int ask_1(int p,int L,int R){
	push_down(p);
	if(L==l(p)&&r(p)==R)xx sum(p);
	int mid=l(p)+r(p)>>1;
	if(mid<L)xx ask_1(p*2+1,L,R);
	else if(mid>=R)xx ask_1(p*2,L,R);
	else xx ask_1(p*2,L,mid)+ask_1(p*2+1,mid+1,R); 
}

Tree ask_2(int p,int L,int R)
{
	push_down(p);
	if(L==l(p)&&r(p)==R)xx t[p];
	int mid=l(p)+r(p)>>1;
	if(mid<L)xx ask_2(p*2+1,L,R);
	else if(mid>=R)xx ask_2(p*2,L,R);
	else{
		Tree k,LL=ask_2(p*2,L,mid),RR=ask_2(p*2+1,mid+1,R);
		k.sum=LL.sum+RR.sum;
		rep(i,0,1){
			k.lmax[i]=LL.lmax[i];
			if(i==1&&LL.sum==LL.r-LL.l+1)k.lmax[i]+=RR.lmax[i];
			else if(i==0&&LL.sum==0)k.lmax[i]+=RR.lmax[i];
			k.rmax[i]=RR.rmax[i];
			if(i==1&&RR.sum==RR.r-RR.l+1)k.rmax[i]+=LL.rmax[i];
			else if(i==0&&RR.sum==0)k.rmax[i]+=LL.rmax[i];
			
			k.max_n[i]=LL.rmax[i]+RR.lmax[i];
			k.max_n[i]=max(k.max_n[i],LL.max_n[i]);
			k.max_n[i]=max(k.max_n[i],RR.max_n[i]);
		}
		xx k;
	}
}

void solve()
{
	scanf("%d%d",&n,&m);
	rep(i,1,n)scanf("%d",&a[i]);
	build(1,1,n);
	while(m--)
	{
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);l++,r++;
		if(op==0||op==1||op==2)change(1,l,r,op);
		else if(op==3)printf("%d\n",ask_1(1,l,r));
		else printf("%d\n",ask_2(1,l,r).max_n[1]);
	}
	xx;
}

signed main()
{
	solve();
	xx 0;
}

就只过了#11,样例也没过,调不出来。。。

2024/9/10 21:05
加载中...