想打部分分但寄了
查看原帖
想打部分分但寄了
667558
_Kamisato_Ayaka_楼主2023/11/25 17:10

救救蒟蒻吧

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
int n,m;
string s; 

struct node{
	int l, r, sum;
}tree[N << 4];

void Pushup(int rt)
{
	tree[rt].sum = tree[rt * 2].sum + tree[rt * 2 + 1].sum;
}

void build(int l, int r, int rt)
{
	tree[rt].l = l;
	tree[rt].r = r;
	if(l == r)
	{
		tree[rt].sum = s[l] - '0';
		return;
	}
	int mid = l + r >> 1;
	build(l, mid, rt * 2);
	build(mid + 1, r, rt * 2  + 1);
	Pushup(rt);
}

void Updata(int rt, int l, int r, int pos)
{
	if(tree[rt].l == tree[rt].r)
	{
		tree[rt].sum ^= 1;
		return;
	}
	int mid = tree[rt].l + tree[rt].r >> 1;
	if(pos <= mid)
		Updata(rt * 2, l, mid, pos);
	if(pos > mid)
		Updata(rt * 2 + 1, mid + 1, r, pos);
	Pushup(rt);
}

int query(int rt, int l, int r)
{
	if(l <= tree[rt].l && r >= tree[rt].r)
	{
		return tree[rt].sum;
	}
	int mid = tree[rt].l + tree[rt].r >> 1;
	int res = 0;
	if(l <= mid)
		res += query(rt * 2, l, mid);
	if(r > mid)
		res += query(rt * 2 + 1, mid + 1, r);
	return res;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> s;
	s = " " + s;
	build(1, n, 1);
	while(m --)
	{
		int op, l, r;
		cin >> op >> l >> r;
		if(op == 0)
		{
			for(int i=l;i<=r;i++)
			{
				Updata(1, 1, n, i);
			}
		}
		else
		{
			cout << query(1, l, r) << endl;
		}
	}
	return 0;
}
2023/11/25 17:10
加载中...