10分求助,样例过了
查看原帖
10分求助,样例过了
999274
CNS_5t0_0r2楼主2023/8/5 09:27
#include<bits/stdc++.h>
#define int long long 
#define cal int mid = (l + r) / 2,lchild = root * 2,rchild = root * 2 + 1;
#define upd tree[root].val = tree[lchild].val + tree[rchild].val;
using namespace std;
const int N = 1e6 + 9,ROOT = 1;
struct node {
	int val,tag;
} tree[N];
int Len(int l,int r){
    return r - l + 1;
}
void make_tag(int root,int len){
	tree[root].val = len - tree[root].val;
	tree[root].tag ^= 1;
}
void push_down(int root,int l,int r){
    cal;
	make_tag(lchild,Len(l,mid));
	make_tag(rchild,Len(mid + 1,r));
	tree[root].tag = 0;
}
void update(int s,int t,int l,int r,int root) {
	if(s <= l && r <= t) {
		make_tag(root,Len(l,r));
		return;
	}
	cal
	push_down(root,l,r);
	if(s <= mid)
		update(s,t,l,mid,lchild);
	if(t > mid)
		update(s,t,mid + 1,r,rchild);
	upd
}
int getsum(int s, int t, int l, int r, int root) {
	if(s <= l && r <= t)
		return tree[root].val;
	cal
	push_down(root,l,r);
	int sum = 0;
	if(s <= mid)
		sum += getsum(s,t,l,mid,lchild);
	if(t > mid)
		sum += getsum(s,t,mid + 1,r,rchild);
	return sum; 
}

int n,m;
int op,x,y,k;
signed main() {
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= m; i++) {
		scanf("%lld%lld%lld", &op, &x, &y);
		if(op == 0)
			update(1,n,x,y,ROOT);
		else if(op == 1)
			printf("%lld\n", getsum(1,n,x,y,ROOT));
	}
}
2023/8/5 09:27
加载中...