P3870开关 线段树0pts求助
  • 板块题目总版
  • 楼主WD2c0mP
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/6 18:04
  • 上次更新2023/11/3 05:33:26
查看原帖
P3870开关 线段树0pts求助
780641
WD2c0mP楼主2023/8/6 18:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[100010],f[400010],tag[400010];
bool inrange(int l,int r,int l2,int r2) { // [l,r]包含[l2,r2] 
	return l <= l2 && r >= r2;
}
bool outofrange(int l,int r,int l2,int r2) { // [l,r]与[l2,r2]不相交 
	return l > r2 || r < l2;
}
void maketag(int u,int len,int val) {
	f[u] = len - f[u];
	tag[u] ^= val;
}
void pushdown(int u,int l,int r) { // 懒标记下放 
	int mid = (l + r) >> 1;
	maketag(u + u,mid - l + 1,tag[u]);
	maketag(u + u + 1,r - mid,tag[u]);
	tag[u] = 0;
}
void modify(int u,int l,int r,int L,int R,int val) {
	if (inrange(L,R,l,r)) maketag(u,r - l + 1,val);
	else if (!outofrange(l,r,L,R)) {
		pushdown(u,l,r);
		int mid = (l + r) >> 1;
		modify(u + u,l,mid,L,R,val);
		modify(u + u + 1,mid + 1,r,L,R,val);
		f[u] = f[u + u] + f[u + u + 1];
	}
}
int query(int u,int l,int r,int L,int R) {
	if (inrange(L,R,l,r)) return f[u];
	else if (!outofrange(l,r,L,R)) {
		pushdown(u,l,r);
		int mid = (l + r) >> 1;
		return query(u + u,l,mid,L,R) + query(u + u + 1,mid + 1,r,L,R);
	} else return 0;
}
signed main(){
	cin >> n >> m;
	while (m --) {
		int op,x,y;
		cin >> op >> x >> y;
		if (op == 0) {
			modify(1,1,n,x,y,1);
		} else {
			cout << query(1,1,n,x,y) << endl;
		}
	}
	return 0;
}
2023/8/6 18:04
加载中...