社区讨论
离谱离谱真离谱,答案对的为什么还能听取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 条回复,欢迎继续交流。
正在加载回复...