社区讨论

仅过HACK,0pts求调

P2572[SCOI2010] 序列操作参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjf66z7b
此快照首次捕获于
2025/12/21 11:31
3 个月前
此快照最后确认于
2025/12/23 19:30
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;
#define int long long
#define lson fa << 1, l, mid
#define rson fa << 1 | 1, mid + 1, r

int n, m;
const int N = 4e6 + 10;

struct node{
	int sum, tag, rev, len;
	int l, l0, r, r0, all, all0;
}tree[N * 4];
int a[N];
node operator +(node x, node y){
	node fa;
	fa.sum = x.sum + y.sum;
	fa.len = x.len + y.len;
	fa.l = x.l;
	if (x.l == x.len) fa.l = x.l + y.l;
	fa.r = y.r;
	if (y.r == y.len) fa.r = y.r + x.r;
	fa.l0 = x.l0;
	if (x.l0 == x.len) fa.l0 = x.l0 + y.l0;
	fa.r0 = y.r0;
	if (y.r0 == y.len) fa.r0 = y.r0 + x.r0;
	fa.all = max(max(x.all, y.all), x.r + y.l);
	fa.all0 = max(max(x.all0, y.all0), x.r0 + y.l0); 
	return fa;
}
inline void push_up(int fa){
	tree[fa] = tree[fa << 1] + tree[fa << 1 | 1];
}

inline void push_down(int fa, int l, int  r){
	if (tree[fa].tag){
		tree[fa << 1].tag = tree[fa << 1 | 1].tag = tree[fa].tag;
		tree[fa << 1].sum = tree[fa << 1].len * (tree[fa].tag - 1);
		tree[fa << 1 | 1].sum = tree[fa << 1 | 1].len * (tree[fa].tag - 1);
		if (tree[fa].tag == 2){
			tree[fa << 1].l = tree[fa << 1].r = tree[fa << 1].all = tree[fa << 1].len;
			tree[fa << 1].l0 = tree[fa << 1].r0 = tree[fa << 1].all0 = 0;
			tree[fa << 1 | 1].l = tree[fa << 1 | 1].r = tree[fa << 1 | 1].all = tree[fa << 1 | 1].len;
			tree[fa << 1 | 1].l0 = tree[fa << 1 | 1].r0 = tree[fa << 1 | 1].all0 = 0;
		}
		else{
			tree[fa << 1].l = tree[fa << 1].r = tree[fa << 1].all = 0;
			tree[fa << 1].l0 = tree[fa << 1].r0 = tree[fa << 1].all0 = tree[fa << 1].len;
			tree[fa << 1 | 1].l = tree[fa << 1 | 1].r = tree[fa << 1 | 1].all = 0;
			tree[fa << 1 | 1].l0 = tree[fa << 1 | 1].r0 = tree[fa << 1 | 1].all0 = tree[fa << 1 | 1].len;
		}
		tree[fa].tag = tree[fa << 1].rev = tree[fa << 1 | 1].rev = 0;
	}
	if (tree[fa].rev){
		tree[fa << 1].rev ^= tree[fa].rev;
		tree[fa << 1 | 1].rev ^= tree[fa].rev;
		tree[fa << 1].sum = tree[fa << 1].len - tree[fa << 1].sum;
		swap(tree[fa << 1].l, tree[fa << 1].l0);
		swap(tree[fa << 1].r, tree[fa << 1].r0);
		swap(tree[fa << 1].all, tree[fa << 1].all0);
		tree[fa << 1 | 1].sum = tree[fa << 1 | 1].len - tree[fa << 1 | 1].sum;
		swap(tree[fa << 1 | 1].l, tree[fa << 1 | 1].l0);
		swap(tree[fa << 1 | 1].r, tree[fa << 1 | 1].r0);
		swap(tree[fa << 1 | 1].all, tree[fa << 1 | 1].all0);
		tree[fa].rev = 0;
	}
}

inline void build(int fa, int l, int r){
	if (l == r){
		tree[fa].sum = a[l];
		tree[fa].len = 1;
		if (a[l] == 1) tree[fa].l = tree[fa].r = tree[fa].all = 1, tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = 0;
		else tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = 1, tree[fa].l = tree[fa].r = tree[fa].all = 0;
		return;
	}
	int mid = (l + r) >> 1;
	build(lson);
	build(rson);
	push_up(fa);
}

inline void updata1(int fa, int l, int r, int ql, int qr, bool flag){
	push_down(fa, l, r);
	if (ql <= l && qr >= r){
		tree[fa].tag = flag + 1;
		tree[fa].rev = 0;
		if (flag == 1){
			tree[fa].sum = tree[fa].l = tree[fa].r = tree[fa].all = tree[fa].len;
			tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = 0;
		}
		else{
			tree[fa].sum = tree[fa].l = tree[fa].r = tree[fa].all = 0;
			tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = tree[fa].len;
		}
		return;
	}
	int mid = (l + r) >> 1;
	if (ql <= mid) updata1(lson, ql, qr, flag);
	if (qr > mid) updata1(rson, ql, qr, flag);
	push_up(fa);
}

inline void updata2(int fa, int l, int r, int ql, int qr){
	push_down(fa, l, r);
	if (ql <= l && qr >= r){
		tree[fa].rev ^= 1;
		tree[fa].sum = tree[fa].len - tree[fa].sum;
		swap(tree[fa].l, tree[fa].l0);
		swap(tree[fa].r, tree[fa].r0);
		swap(tree[fa].all, tree[fa].all0);
		return;
	}
	int mid = (l + r) >> 1;
	if (ql <= mid) updata2(lson, ql, qr);
	if (qr > mid) updata2(rson, ql, qr);
	push_up(fa);
}

inline node query(int fa, int l, int r, int ql, int qr){
	push_down(fa, l, r);
	if (ql <= l && qr >= r){
		return tree[fa];
	}
	int mid = (l + r) >> 1;
	node ans = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	if (ql <= mid && qr > mid) return query(lson, ql, qr) + query(rson, ql, qr);
	if (ql <= mid) return query(lson, ql, qr);
	if (qr > mid) return query(rson, ql, qr);
}

signed main(){
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	build(1, 1, n);
	while (m--){
		int opt, l, r;
		cin >> opt >> l >> r;
		l += 1;
		r += 1;
		if (l > r) swap(l, r);
		if (opt == 0 || opt == 1){
			updata1(1, 1, n, l, r, opt);
		}
		if (opt == 2){
			updata2(1, 1, n, l, r);
		}
		if (opt == 3 || opt == 4){
			node ans = query(1, 1, n, l, r);
			if (opt == 3) cout << ans.sum <<"\n";
			if (opt == 4) cout << ans.all << "\n";
		}
	}
	return 0;
}


回复

0 条回复,欢迎继续交流。

正在加载回复...