只过hack求调
查看原帖
只过hack求调
757865
dengqingrui123楼主2024/8/19 16:57
#include<bits/stdc++.h>
#define ll long long 

using namespace std;

const ll N = 5e5 + 5;

void push_down(ll k);

struct tree{
	ll l,r;
	ll lazy,k,lazy1; 
	ll ans0,ans1,all1,all0; 
	ll left0,right0,left1,right1;
}X[N * 4];

ll n,m,op,x,y;
ll a[N];
string s;

void SWAP(ll k){ 
	swap(X[k].ans0,X[k].ans1);
	swap(X[k].left0,X[k].left1);
	swap(X[k].right0,X[k].right1);
	swap(X[k].all1,X[k].all0);
} 

void pushup(ll k){  
	push_down(k);
	X[k].left0 = X[k * 2].left0;
	if(X[k * 2].k == X[k * 2].left0)	X[k].left0 += X[k * 2 + 1].left0;
	X[k].right0 = X[k * 2 + 1].right0;
	if(X[k * 2 + 1].k == X[k * 2 + 1].right0)	X[k].right0 += X[k * 2].right0;
	X[k].left1 = X[k * 2].left1;
	if(X[k * 2].k == X[k * 2].left1)	X[k].left1 += X[k * 2 + 1].left1;
	X[k].right1 = X[k * 2 + 1].right1;
	if(X[k * 2 + 1].k == X[k * 2 + 1].right1)	X[k].right1 += X[k * 2].right1;
	X[k].ans0 = max(max(X[k * 2].ans0,X[k * 2 + 1].ans0),X[k * 2].right0 + X[k * 2 + 1].left0);
	X[k].ans1 = max(max(X[k * 2].ans1,X[k * 2 + 1].ans1),X[k * 2].right1 + X[k * 2 + 1].left1);
	X[k].all0 = X[k * 2].all0 + X[k * 2 + 1].all0;
	X[k].all1 = X[k * 2].all1 + X[k * 2 + 1].all1;
}

void build(ll k,ll l,ll r){
	X[k].l = l,X[k].r = r;
	X[k].lazy = 0;
	X[k].k = r - l + 1;
	if(l == r){
		X[k].all0 = X[k].ans0 = X[k].left0 = X[k].right0 = !a[l];
		X[k].all1 = X[k].ans1 = X[k].left1 = X[k].right1 = a[l];
		return ;
	}
	ll mid = (l + r) >> 1;
	build(k * 2, l, mid);
	build(k * 2 + 1,mid + 1, r);
	pushup(k);
	return;
}

void push_down(ll k){ 
	if(X[k].lazy1){
		X[k * 2].lazy1 =  X[k].lazy1;
		X[k * 2 + 1].lazy1 = X[k].lazy1;
		if(X[k].lazy1 == 1){
			X[k * 2].ans0 = X[k * 2].all0 = X[k * 2].left0 = X[k * 2].right0 = X[k * 2].k;
			X[k * 2].ans1 = X[k * 2].all1 = X[k * 2].left1 = X[k * 2].right1 = 0;
			X[k * 2 + 1].ans0 = X[k * 2 + 1].all0 = X[k * 2 + 1].left0 = X[k * 2 + 1].right0 = X[k * 2 + 1].k;
			X[k * 2 + 1].ans1 = X[k * 2 + 1].all1 = X[k * 2 + 1].left1 = X[k * 2 + 1].right1 = 0;
		} 
		if(X[k].lazy1 == 2){
			X[k * 2].ans1 = X[k * 2].all1 = X[k * 2].left1 = X[k * 2].right1 = X[k * 2].k;
			X[k * 2].ans0 = X[k * 2].all0 = X[k * 2].left0 = X[k * 2].right0 = 0;
			X[k * 2 + 1].ans1 = X[k * 2 + 1].all1 = X[k * 2 + 1].left1 = X[k * 2 + 1].right1 = X[k * 2 + 1].k;
			X[k * 2 + 1].ans0 = X[k * 2 + 1].all0 = X[k * 2 + 1].left0 = X[k * 2 + 1].right0 = 0;
		} 
		X[k].lazy1 = 0,X[k].lazy = 0;
	}
	else if(X[k].lazy){
		X[k * 2].lazy ^= 1;
		X[k * 2 + 1].lazy ^= 1;
		SWAP(k * 2);
		SWAP(k * 2 + 1);
		X[k].lazy = 0;
	}
	return;
}

void fan(ll k,ll l,ll r){  
	push_down(k);
	if(X[k].l >= l && X[k].r <= r){
		X[k].lazy ^= 1, SWAP(k);
		return ;
	}
	if(X[k].l > r || X[k].r < l) return;
	push_down(k);
	
	fan(k << 1,l,r);
	fan(k << 1 | 1,l,r);
	pushup(k);
	return ;
}

tree search(ll k,ll l,ll r){
	push_down(k);
	if(X[k].l >= l && X[k].r <= r)	return X[k];
	push_down(k);
	ll mid = (X[k].l + X[k].r) >> 1;
	if(r <= mid) return search(k << 1,l,r);
	if(l > mid)	return search(k << 1 | 1,l,r);
	tree x = search(k << 1,l,r),y = search(k << 1 | 1,l,r),z;
	z.left1 = x.left1;
	if(x.left1 == x.k)	z.left1 +=  y.left1;
	z.right1 = y.right1;
	if(y.right1 == y.k)	z.right1 += x.right1;
	z.k = x.k + y.k;
	z.ans1 = max(max(x.ans1,y.ans1),x.right1 + y.left1);
	return z;
}

void change1(int k,int l,int r){
	push_down(k); 
	if(X[k].l > r || X[k].r < l) return;
	push_down(k);
	if(X[k].l >= l && X[k].r <= r){
		X[k].lazy1 = x + 1;
		X[k].left0 = X[k].right0 = X[k].ans0 = X[k].all0 = 0;
		X[k].left1 = X[k].right1 = X[k].ans1 = X[k].all1 = X[k].k;
		return;
	}
	change1(k * 2,l,r);
	change1(k * 2 + 1,l,r);
	pushup(k);
	return;
}

void change0(int k,int l,int r){
	push_down(k); 
	if(X[k].l > r || X[k].r < l) return;
	push_down(k);
	if(X[k].l >= l && X[k].r <= r){
		X[k].lazy1 = x + 1;
		X[k].left0 = X[k].right0 = X[k].ans0 = X[k].all0 = X[k].k;
		X[k].left1 = X[k].right1 = X[k].ans1 = X[k].all1 = 0;
		return;
	}
	change0(k * 2,l,r);
	change0(k * 2 + 1,l,r);
	pushup(k);
	return;
}

long long search1(ll k,ll l,ll r){
	push_down(k);
	if(X[k].l >= l && r >= X[k].r) return X[k].all1 ;
	if(X[k].l > r || X[k].r < l) return 0;
	return search1(k * 2,l,r) + search1(k * 2 + 1,l ,r);
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){cin >> a[i];}
	build(1,1,n);
	while(m--){
		cin >> op >> x >> y;
		x++,y++;
		if(op == 0)change0(1,x,y);
		if(op == 1)change1(1,x,y);
		//if(op == 0 || op == 1) change(op,1,x,y);
		if(op == 2)	fan(1,x,y);
		if(op == 3) cout << search1(1,x,y) << endl;
		if(op == 4) cout << search(1,x,y).ans1 << endl;
	}
	return 0;
}
/*
10 10
0 1 0 1 1 0 1 0 0 1 
2 1 2
4 7 7
4 0 3
1 0 6
2 0 9
3 1 9
3 2 6
2 1 2
4 2 6
3 4 6

0
2
2
0
1
0
*/

最后注释掉的是一组 hack 数据,可是我过不了它

2024/8/19 16:57
加载中...