已经调疯了
#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