只过了hack 0pts求调
查看原帖
只过了hack 0pts求调
169326
panxz2009楼主2024/10/20 20:43

已经调疯了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, m, a[maxn], op, x, y;
struct Tree {
	struct tree {
		int lmax1, rmax1, lmax0, rmax0, mx1, mx0, sum, tag1, tag2, len;
		friend tree operator + (tree x, tree y) {
			tree z;
			z.lmax1 = x.lmax1;
			if(x.lmax1 == x.len) z.lmax1 += y.lmax1;
			z.rmax1 = y.rmax1;
			if(y.rmax1 == y.len) z.rmax1 += x.rmax1;
			z.mx1 = max({x.mx1, y.mx1, x.rmax1 + y.lmax1}); 
			z.len = x.len + y.len;
			return z;
		} 
	}t[maxn << 2];
	void pushdown(int pos, int L, int R) {
		int &t1 = t[pos].tag1, &t2 = t[pos].tag2;
		int mid = (L + R) >> 1;
		if(t1 < 2) {
			t[pos << 1].tag1 = t[pos << 1 | 1].tag1 = t1;
			t[pos << 1].tag2 = t[pos << 1 | 1].tag2 = t2 = 0;
			if(t1 == 0) {
				t[pos << 1].lmax0 = t[pos << 1].rmax0 = t[pos << 1].mx0 = mid - L + 1;
				t[pos << 1].lmax1 = t[pos << 1].rmax1 = t[pos << 1].mx1 = 0;
				t[pos << 1 | 1].lmax0 = t[pos << 1 | 1].rmax0 = t[pos << 1 | 1].mx0 = R - mid;
				t[pos << 1 | 1].lmax1 = t[pos << 1 | 1].rmax1 = t[pos << 1 | 1].mx1 = 0;
				t[pos << 1].sum = t[pos << 1 | 1].sum = 0;
			}
			else {
				t[pos << 1].lmax0 = t[pos << 1].rmax0 = t[pos << 1].mx0 = 0;
				t[pos << 1].lmax1 = t[pos << 1].rmax1 = t[pos << 1].mx1 = mid - L + 1;
				t[pos << 1 | 1].lmax0 = t[pos << 1 | 1].rmax0 = t[pos << 1 | 1].mx0 = 0;
				t[pos << 1 | 1].lmax1 = t[pos << 1 | 1].rmax1 = t[pos << 1 | 1].mx1 = R - mid;
				t[pos << 1].sum = mid - L + 1;
				t[pos << 1 | 1].sum = R - mid;
			}
		}
		if(t2) {
			if(t[pos << 1].tag1 < 2) t[pos << 1].tag1 = 1 - t[pos << 1].tag1;
			else t[pos << 1].tag2 = 1 - t[pos << 1].tag2;
			if(t[pos << 1 | 1].tag1 < 2) t[pos << 1 | 1].tag1 = 1 - t[pos << 1 | 1].tag1;
			else t[pos << 1 | 1].tag2 = 1 - t[pos << 1 | 1].tag2;
			swap(t[pos << 1].lmax0, t[pos << 1].lmax1);
			swap(t[pos << 1].rmax0, t[pos << 1].rmax1);
			swap(t[pos << 1].mx0, t[pos << 1].mx1);
			t[pos << 1].sum = mid - L + 1 - t[pos << 1].sum;
			swap(t[pos << 1 | 1].lmax0, t[pos << 1 | 1].lmax1);
			swap(t[pos << 1 | 1].rmax0, t[pos << 1 | 1].rmax1);
			swap(t[pos << 1 | 1].mx0, t[pos << 1 | 1].mx1);
			t[pos << 1 | 1].sum = R - mid - t[pos << 1 | 1].sum;
		}
		t1 = 2, t2 = 0;
	}
	void pushup(int pos, int L, int R) {
		int mid = (L + R) >> 1;
		t[pos].lmax0 = t[pos << 1].lmax0;
		if(t[pos << 1].lmax0 == mid - L + 1) t[pos].lmax0 += t[pos << 1 | 1].lmax0;
		t[pos].rmax0 = t[pos << 1 | 1].rmax0;
		if(t[pos << 1 | 1].rmax0== R - mid) t[pos].rmax0 += t[pos << 1].rmax0;
		t[pos].mx0 = max({t[pos << 1].mx0, t[pos << 1 | 1].mx0, t[pos << 1].rmax0 + t[pos << 1 | 1].lmax0});
		t[pos].lmax1 = t[pos << 1].lmax1;
		if(t[pos << 1].lmax1 == mid - L + 1) t[pos].lmax1 += t[pos << 1 | 1].lmax1;
		t[pos].rmax1 = t[pos << 1 | 1].rmax1;
		if(t[pos << 1 | 1].rmax1 == R - mid) t[pos].rmax1 += t[pos << 1].rmax1;
		t[pos].mx1 = max({t[pos << 1].mx1, t[pos << 1 | 1].mx1, t[pos << 1].rmax1 + t[pos << 1 | 1].lmax1});
		t[pos].sum = t[pos << 1].sum + t[pos << 1 | 1].sum;
	}
	void build(int pos, int L, int R) {
		t[pos].tag1 = 2, t[pos].tag2 = 0;
		if(L == R) {
			if(a[L] == 1) {
				t[pos].lmax1 = t[pos].rmax1 = t[pos].mx1 = t[pos].sum = 1;
				t[pos].lmax0 = t[pos].rmax0 = t[pos].mx0 = 0;
			}
			else {
				t[pos].lmax1 = t[pos].rmax1 = t[pos].mx1 = t[pos].sum = 0;
				t[pos].lmax0 = t[pos].rmax0 = t[pos].mx0 = 1;
			}
			return;
		}
		int mid = (L + R) >> 1;
		build(pos << 1, L, mid);
		build(pos << 1 | 1, mid + 1, R);
		pushup(pos, L, R);
	}
	void modify1(int pos, int L, int R, int l, int r, int k) {
		if(l <= L && R <= r) {
			if(k == 0) {
				t[pos].tag1 = 0, t[pos].tag2 = 0;
				t[pos].lmax0 = t[pos].rmax0 = t[pos].mx0 = R - L + 1;
				t[pos].lmax1 = t[pos].rmax1 = t[pos].mx1 = 0;
				t[pos].sum = 0;
			}
			else {
				t[pos].tag1 = 1, t[pos].tag2 = 0;
				t[pos].lmax0 = t[pos].rmax0 = t[pos].mx0 = 0;
				t[pos].lmax1 = t[pos].rmax1 = t[pos].mx1 = R - L + 1;
				t[pos].sum = R - L + 1;
			}
			return;
		}
		pushdown(pos, L, R);
		int mid = (L + R) >> 1;
		if(l <= mid) modify1(pos << 1, L, mid, l, r, k);
		if(r > mid) modify1(pos << 1 | 1, mid + 1, R, l, r, k);
		pushup(pos, L, R);
	}
	void modify2(int pos, int L, int R, int l, int r) {
		if(l <= L && R <= r) {
			if(t[pos].tag1 < 2) t[pos].tag1 = 1 - t[pos].tag1;
			else t[pos].tag2 = 1 - t[pos].tag2;
			swap(t[pos].lmax0, t[pos].lmax1);
			swap(t[pos].rmax0, t[pos].rmax1);
			swap(t[pos].mx0, t[pos].mx1);
			t[pos].sum = R - L + 1 - t[pos].sum;
			return;
		}
		pushdown(pos, L, R);
		int mid = (L + R) >> 1;
		if(l <= mid) modify2(pos << 1, L, mid, l, r);
		if(r > mid) modify2(pos << 1 | 1, mid + 1, R, l, r);
		pushup(pos, L, R);
	}
	int query1(int pos, int L, int R, int l, int r) {
		if(l <= L && R <= r) {
			return t[pos].sum;
		}
		pushdown(pos, L, R);
		int mid = (L + R) >> 1, ans = 0;
		if(l <= mid) ans += query1(pos << 1, L, mid, l, r);
		if(r > mid) ans += query1(pos << 1 | 1, mid + 1, R, l, r);
		pushup(pos, L, R);
		return ans;
	}
	tree query2(int pos, int L, int R, int l, int r) {
		if(l <= L && R <= r) {
			t[pos].len = R - L + 1;
			return t[pos];
		}
		pushdown(pos, L, R);
		int mid = (L + R) >> 1;
		if(l <= mid && r > mid) 
			return query2(pos << 1, L, mid, l, r) + query2(pos << 1 | 1, mid + 1, R, l, r);
		if(l <= mid) 
			return query2(pos << 1, L, mid, l, r);
		if(r > mid) 
			return query2(pos << 1 | 1, mid + 1, R, l, r);
		return {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	}
}T;
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	T.build(1, 1, n);
	while(m--) {
		scanf("%d%d%d", &op, &x, &y);
		x++, y++; 
		if(op == 0) {
			T.modify1(1, 1, n, x, y, 0);
		}
		if(op == 1) {
			T.modify1(1, 1, n, x, y, 1);
		}
		if(op == 2) {
			T.modify2(1, 1, n, x, y);
		}
		if(op == 3) {
			printf("%d\n", T.query1(1, 1, n, x, y));
		}
		if(op == 4) {
			printf("%d\n", T.query2(1, 1, n, x, y).sum);
		}
	}
	return 0;
} 

不多,就6K

2024/10/20 20:43
加载中...