2 条题解
-
2
using namespace std; const int inff = 1e5 + 10; long long n,m,vis[inff],c; struct myst { long long left,right,lazy,sum; } tree[inff * 4 + 1]; void renewup(long long node) { tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum; return; } void renewdown(long long node) { if (tree[node].lazy) { tree[node * 2].sum = (tree[node * 2].right - tree[node * 2].left + 1)-tree[node * 2].sum; tree[node * 2].lazy = !tree[node * 2].lazy; tree[node * 2 + 1].sum = (tree[node * 2 + 1].right - tree[node * 2 + 1].left + 1)-tree[node * 2 + 1].sum; tree[node * 2 + 1].lazy = !tree[node * 2 + 1].lazy; tree[node].lazy = 0; } return; } void build(long long node,long long l,long long r) { tree[node].left = l; tree[node].right = r; if (l == r) { return; } long long mid = l + r >> 1; build(node * 2,l,mid); build(node * 2 + 1,mid + 1,r); renewup(node); return; } void update(long long node,long long l,long long r,long long k) { if (tree[node].left >= l && tree[node].right <= r) { tree[node].sum = tree[node].right - tree[node].left + 1 - tree[node].sum; tree[node].lazy = !tree[node].lazy; return; } renewdown(node); long long mid = tree[node].left + tree[node].right >> 1; if (mid >= l) { update(node * 2,l,r,k); } if (mid < r) { update(node * 2 + 1,l,r,k); } renewup(node); return; } long long get(long long node,long long l,long long r) { if (tree[node].left >= l && tree[node].right <= r) { return tree[node].sum ; } renewdown(node); long long mid = tree[node].left + tree[node].right >> 1,sum = 0; if (mid >= l) { sum += get(node * 2,l,r); } if (mid < r) { sum += get(node * 2 + 1,l,r); } return sum; } int main() { cin >> n >> m; build(1,1,n); while(m--) { cin >> c; long long a,b; if (c == 0) { cin >> a >> b; update(1,a,b,39); } else { cin >> a >> b; cout << get(1,a,b) << endl; } } return 0; }
信息
- ID
- 5054
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者