听灌多,求调P2572
  • 板块灌水区
  • 楼主songzhihan2010
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/29 11:53
  • 上次更新2024/11/29 16:06:07
查看原帖
听灌多,求调P2572
910357
songzhihan2010楼主2024/11/29 11:53

过了hack

#include<bits/stdc++.h>
#define elif else if
using namespace std;
typedef long long ll;
ll read() {ll 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;}
const ll N=1e5+10;
ll n,_,a[N];
ll op,l,r;
struct Node{
	ll len;
	ll sum1,lsum1,rsum1,ans1;
	ll sum0,lsum0,rsum0,ans0;
	friend Node operator+(Node x,Node y) {
		Node ans={0,0,0,0,0,0,0,0,0};
		ans.len=x.len+y.len;
		ans.sum0=x.sum0+y.sum0;
		ans.sum1=x.sum1+y.sum1;
		if(x.sum1==x.len) ans.lsum1=x.len+y.lsum1;
		else ans.lsum1=x.lsum1;
		if(y.sum1==y.len) ans.rsum1=x.rsum1+y.len;
		else ans.rsum1=y.rsum1;
		ans.ans1=max(x.ans1,y.ans1);
		ans.ans1=max(ans.ans1,x.rsum1+y.lsum1);
		if(x.sum0==x.len) ans.lsum0=x.len+y.lsum0;
		else ans.lsum0=x.lsum0;
		if(y.sum0==y.len) ans.rsum0=x.rsum0+y.len;
		else ans.rsum0=y.rsum0;
		ans.ans0=max(x.ans0,y.ans0);
		ans.ans0=max(ans.ans0,x.rsum0+y.lsum0);
		return ans; 
	}
	void fz(Node &x,ll op,ll y){
		x.len=y;
		if(op==1){
			x.sum0=x.lsum0=x.rsum0=x.ans0=y;
			x.sum1=x.lsum1=x.rsum1=x.ans1=0;
		} elif (op==2){
			x.sum0=x.lsum0=x.rsum0=x.ans0=0;
			x.sum1=x.lsum1=x.rsum1=x.ans1=y;
		}
	}
};
struct Tree {
	ll l,r;
	Node message;
	ll lazy;
} t[4*N];
void build(ll q,ll l,ll r) {
	t[q].l=l;
	t[q].r=r;
	if(l==r) {
		if(a[l]==1) t[q].message.fz(t[q].message,2,r-l+1);
		else t[q].message.fz(t[q].message,1,r-l+1);
		return ;
	}
	ll mid=(t[q].l+t[q].r)/2;
	build(q*2,l,mid);
	build(q*2+1,mid+1,r);
	t[q].message=t[q*2].message+t[q*2+1].message;
}
void spread(ll q) {
	if(t[q].lazy==0) return ;
	if(t[q].lazy==1) {
		t[q*2].message.fz(t[q*2].message,1,t[q*2].message.len);
		t[q*2+1].message.fz(t[q*2+1].message,1,t[q*2+1].message.len);
	}
	elif (t[q].lazy==2) {
		t[q*2].message.fz(t[q*2].message,2,t[q*2].message.len);
		t[q*2+1].message.fz(t[q*2+1].message,2,t[q*2+1].message.len);
	}
	elif (t[q].lazy==3) {
		swap(t[q*2].message.ans0,t[q*2].message.ans1);
		swap(t[q*2].message.lsum0,t[q*2].message.lsum1);
		swap(t[q*2].message.rsum0,t[q*2].message.rsum1);
		swap(t[q*2].message.sum0,t[q*2].message.sum1);
		swap(t[q*2+1].message.ans0,t[q*2+1].message.ans1);
		swap(t[q*2+1].message.lsum0,t[q*2+1].message.lsum1);
		swap(t[q*2+1].message.rsum0,t[q*2+1].message.rsum1);
		swap(t[q*2+1].message.sum0,t[q*2+1].message.sum1);
	}
	t[q*2].lazy=t[q*2+1].lazy=t[q].lazy;
	t[q].lazy=0;
}
ll ask_sum(ll q,ll l,ll r) {
	if(t[q].l>=l&&t[q].r<=r) {
		return t[q].message.sum1;
	}
	spread(q);
	ll ans=0,mid=(t[q].l+t[q].r)/2;
	if(l<=mid) ans+=ask_sum(q*2,l,r);
	if(r>mid) ans+=ask_sum(q*2+1,l,r);
	return ans;
}
Node ask_ans(ll q,ll l,ll r) {
	if(t[q].l>=l&&t[q].r<=r) {
		return t[q].message;
	}
	spread(q);
	Node ans={0,0,0,0,0,0,0,0,0},ans1={0,0,0,0,0,0,0,0,0},ans2={0,0,0,0,0,0,0,0,0};
	ll mid=(t[q].l+t[q].r)/2;
	if(l<=mid) ans1=ask_ans(q*2,l,r);
	if(r>mid) ans2=ask_ans(q*2+1,l,r);
	ans=ans1+ans2;
	return ans;
}
void change(ll q,ll l,ll r,ll lazy){
	spread(q);
	if(t[q].l>=l&&t[q].r<=r){
		if(lazy==1){
			t[q].message.fz(t[q].message,1,t[q].message.len);
		} elif (lazy==2) {
			t[q].message.fz(t[q].message,2,t[q].message.len);
		} elif (lazy==3){
			swap(t[q].message.ans0,t[q].message.ans1);
			swap(t[q].message.lsum0,t[q].message.lsum1);
			swap(t[q].message.rsum0,t[q].message.rsum1);
			swap(t[q].message.sum0,t[q].message.sum1);
		}
		t[q].lazy=lazy;
		return ;
	}
	ll mid=(t[q].l+t[q].r)/2;
	if(l<=mid) change(q*2,l,r,lazy);
	if(r>mid) change(q*2+1,l,r,lazy);
	t[q].message=t[q*2].message+t[q*2+1].message;
}
signed main() {
	n=read();
	_=read();
	for (int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	while(_--) {
		op=read();
		l=read();
		r=read();
		l++;
		r++;
		if(op==0) {
			change(1,l,r,1);
		}
		elif (op==1) {
			change(1,l,r,2);
		}
		elif (op==2) {
			change(1,l,r,3);
		}
		elif (op==3) {
			printf("%lld\n",ask_sum(1,l,r));
		}
		elif(op==4) {
			printf("%lld\n",ask_ans(1,l,r).ans1);
		}
	}
}
2024/11/29 11:53
加载中...