请求加强数据,tag没清都90分了!!!
查看原帖
请求加强数据,tag没清都90分了!!!
557781
ruojiyz楼主2023/8/20 20:40

@Alex_Wei

#include <bits/stdc++.h>
using namespace std;

#define ls p << 1
#define rs p << 1 | 1
const int N = 1e5 + 5;

int n, m;
int opt, ql, qr;

struct node{
	int s, mx1, mx0, len;
	int l1, r1, l0, r0;
	int tg, tg1, tg0;
} t[4 * N];

void pushup(int p)
{
	t[p].s = t[ls].s + t[rs].s;
	if(t[ls].l1 != t[ls].len) t[p].l1 = t[ls].l1;
	else 					  t[p].l1 = t[ls].l1 + t[rs].l1;
	
	if(t[rs].r1 != t[rs].len) t[p].r1 = t[rs].r1;
	else                      t[p].r1 = t[rs].r1 + t[ls].r1;
	
	if(t[ls].l0 != t[ls].len) t[p].l0 = t[ls].l0;
	else 					  t[p].l0 = t[ls].l0 + t[rs].l0;
	
	if(t[rs].r0 != t[rs].len) t[p].r0 = t[rs].r0;
	else 					  t[p].r0 = t[rs].r0 + t[ls].r0;
	
	t[p].mx1 = max({t[ls].mx1, t[rs].mx1, t[ls].r1 + t[rs].l1});
	t[p].mx0 = max({t[ls].mx0, t[rs].mx0, t[ls].r0 + t[rs].l0});
	return;
}

void pushdown(int p)
{
	if(t[p].tg0)
	{
		t[ls].s = t[ls].mx1 = t[ls].l1 = t[ls].r1 = 0;
		t[ls].mx0 = t[ls].l0 = t[ls].r0 = t[ls].len;
		
		t[rs].s = t[rs].mx1 = t[rs].l1 = t[rs].r1 = 0;
		t[rs].mx0 = t[rs].l0 = t[rs].r0 = t[rs].len;	
		
		t[ls].tg0 = t[rs].tg0 = 1; 
		t[ls].tg = t[rs].tg = t[ls].tg1 = t[rs].tg1 = 0; //正确代码 
		//t[ls].tg = t[rs].tg = 0; 错误代码 
	}
	if(t[p].tg1)
	{
		t[ls].s = t[ls].mx1 = t[ls].l1 = t[ls].r1 = t[ls].len;
		t[ls].mx0 = t[ls].l0 = t[ls].r0 = 0;
		
		t[rs].s = t[rs].mx1 = t[rs].l1 = t[rs].r1 = t[rs].len;
		t[rs].mx0 = t[rs].l0 = t[rs].r0 = 0;
		
		t[ls].tg1 = t[rs].tg1 = 1; 
		t[ls].tg = t[rs].tg = t[ls].tg0 = t[rs].tg0 = 0; //正确代码 
		//t[ls].tg = t[rs].tg = 0; 错误代码	
	}
	if(t[p].tg)
	{
		t[ls].s = t[ls].len - t[ls].s;
		t[rs].s = t[rs].len - t[rs].s;
		swap(t[ls].mx1, t[ls].mx0);
		swap(t[rs].mx1, t[rs].mx0);
		swap(t[ls].l1, t[ls].l0);
		swap(t[rs].l1, t[rs].l0);
		swap(t[ls].r1, t[ls].r0);
		swap(t[rs].r1, t[rs].r0);
		t[ls].tg ^= 1; t[rs].tg ^= 1;		
	}
	t[p].tg0 = t[p].tg1 = t[p].tg = 0;
	return;
}

void build(int l, int r, int p)
{
	t[p].len = r - l + 1;
	if(l == r)
	{
		cin >> t[p].s;
		if(t[p].s) t[p].l1 = t[p].r1 = t[p].mx1 = 1;
		else t[p].l0 = t[p].r0 = t[p].mx0 = 1;
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, ls);
	build(mid + 1, r, rs);
	pushup(p);
	return;
}

void to0(int l, int r, int p)
{
	if(ql <= l && r <= qr)
	{
		t[p].s = t[p].mx1 = t[p].l1 = t[p].r1 = 0;
		t[p].mx0 = t[p].l0 = t[p].r0 = t[p].len;
		t[p].tg = t[p].tg1 = 0; t[p].tg0 = 1;
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1;
	if(ql <= mid) to0(l, mid, ls);
	if(qr > mid) to0(mid + 1, r, rs);
	pushup(p);
	return;
}

void to1(int l, int r, int p)
{
	if(ql <= l && r <= qr)
	{
		t[p].s = t[p].mx1 = t[p].l1 = t[p].r1 = t[p].len;
		t[p].mx0 = t[p].l0 = t[p].r0 = 0;
		t[p].tg = t[p].tg0 = 0; t[p].tg1 = 1;
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1;
	if(ql <= mid) to1(l, mid, ls);
	if(qr > mid) to1(mid + 1, r, rs);
	pushup(p);
	return; 
}

void change(int l, int r, int p)
{
	if(ql <= l && r <= qr)
	{
		t[p].s = t[p].len - t[p].s;
		swap(t[p].mx1, t[p].mx0);
		swap(t[p].l1, t[p].l0);
		swap(t[p].r1, t[p].r0);
		t[p].tg ^= 1;
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1;
	if(ql <= mid) change(l, mid, ls);
	if(qr > mid) change(mid + 1, r, rs);
	pushup(p);
	return;
}

int query(int l, int r, int p)
{
	if(ql <= l && r <= qr) return t[p].s;
	pushdown(p);
	int mid = (l + r) >> 1, sum = 0;
	if(ql <= mid) sum += query(l, mid, ls);
	if(qr > mid) sum += query(mid + 1, r, rs);
	return sum; 
}

node find(int l, int r, int p)
{
	if(ql <= l && r <= qr) return t[p];
	pushdown(p);
	int mid = (l + r) >> 1; node ans, t1, t2;
	if(ql <= mid) t1 = find(l, mid, ls);
	if(qr > mid) t2 = find(mid + 1, r, rs);
	if(ql > mid) return t2;
	if(qr <= mid) return t1;
	if(t1.l1 != t1.len) ans.l1 = t1.l1;
	else ans.l1 = t1.l1 + t2.l1;
	if(t2.r1 != t2.len) ans.r1 = t2.r1;
	else ans.r1 = t2.r1 + t1.r1;
	if(t1.l0 != t1.len) ans.l0 = t1.l0;
	else ans.l0 = t1.l0 + t2.l0;
	if(t2.r0 != t2.len) ans.r0 = t2.r0;
	else ans.r0 = t2.r0 + t1.r0;
	ans.mx1 = max({t1.mx1, t2.mx1, t1.r1 + t2.l1});
	ans.mx0 = max({t1.mx0, t2.mx0, t1.r0 + t2.l0});
	return ans;	
}

int main()
{
	
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> m;
	build(1, n, 1);
	while(m --)
	{
		cin >> opt >> ql >> qr;
		ql ++; qr ++;
		if(opt == 0) to0(1, n, 1);
		else if(opt == 1) to1(1, n, 1);
		else if(opt == 2) change(1, n, 1);
		else if(opt == 3) cout << query(1, n, 1) << "\n";
		else cout << find(1, n, 1).mx1 << "\n";
	}
	
	return 0;
} 
2023/8/20 20:40
加载中...