社区讨论

离谱离谱真离谱,答案对的为什么还能听取WA声一片

P2574XOR的艺术参与者 3已保存回复 8

讨论操作

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

当前回复
8 条
当前快照
1 份
快照标识符
@lo264mhk
此快照首次捕获于
2023/10/23 08:37
2 年前
此快照最后确认于
2024/08/07 14:23
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define endl '\n'

const ll N = 2e5+10;

int n, m, a[N];

struct node
{
	ll l, r;
	ll sum, add;
}tr[N * 4];

inline void pushup(ll u)
{
	tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}

inline void pushdown(ll u)
{
	if(tr[u].add)
	{
		ll ls = u << 1, rs = u << 1 | 1;
		tr[ls].add ^= 1, tr[rs].add ^= 1;
		tr[ls].sum = (tr[ls].r - tr[ls].l + 1) - tr[ls].sum;
		tr[rs].sum = (tr[rs].r - tr[rs].l + 1) - tr[rs].sum;
		tr[u].add = 0;
	}
}

inline void build(ll u, ll l, ll r)
{
	if(l == r)
	{
		tr[u] = {l, r, a[l], 0};
	}
	else
	{
		tr[u] = {l, r};
		ll mid = l + r >> 1;
		build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}

inline void modify(ll u, ll l, ll r)
{
	if(tr[u].l >= l && tr[u].r <= r)
	{
		tr[u].add ^= 1;
		tr[u].sum = (tr[u].r - tr[u].l + 1) - tr[u].sum;
	}
	else
	{
		if(tr[u].add) pushdown(u);
		ll mid = tr[u].l + tr[u].r >> 1;
		if(l <= mid) modify(u << 1, l, r);
		if(r > mid) modify(u << 1 | 1, l, r);
		pushup(u);
	}
}

inline ll query(ll u, ll l, ll r)
{
	if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
	else
	{
		if(tr[u].add) pushdown(u);
		ll sum = 0;
		ll mid = tr[u].l + tr[u].r >> 1;
		if(l <= mid) sum = query(u << 1, l, r);
		if(r > mid) sum += query(u << 1 | 1, l, r);
		return sum;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
//	freopen("ans.out", "w", stdout);
	cin >> n >> m;
	for(rl i=1;i <= n;++ i) scanf("%1d", &a[i]);
	build(1, 1, n);
	
	while(m --)
	{
		ll op, x, y;
		cin >> op >> x >> y;
		if(op)
		{
			cout << query(1, x, y) << endl;
		}
		else
		{
			modify(1, x, y);
		}
	}
	return 0;
}

回复

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

正在加载回复...