线段树,求调
  • 板块灌水区
  • 楼主_Albus_
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/8/15 16:54
  • 上次更新2024/8/15 19:07:51
查看原帖
线段树,求调
657718
_Albus_楼主2024/8/15 16:54

rt 题目在这

按照第一篇题解的思路些的,输入样例会停止工作

#include <bits/stdc++.h>
using namespace std;
const int N=1100000;
int n,m,o,x,y,sum[N],la[N];
void pushdown (int k,int l,int r) {
	if (la[k]) {
		int mid=(r-l)/2;
		la[k*2]^=1;
		la[k*2+1]^=1;
		sum[k*2]=mid-l+1-sum[k*2];
		sum[k*2+1]=r-mid-sum[k*2+1];
		la[k]=0;
	}
}
void update (int k,int l,int r,int x,int y) {
	if (x<=l && y>=r) {
		la[k]^=1;
		sum[k]=(r-l+1)-sum[k];
		return;
	}
	pushdown(k,l,r);
	int mid=(r-l+1)/2;
	if (x<=mid)
		update(k*2,l,mid,x,y);
	if (y>mid)
		update(k*2+1,mid+1,r,x,y);
	sum[k]=sum[k*2]+sum[k*2+1];
}
long long cha (int k,int l,int r,int x,int y) {
	if (x<=l && y>=r) {
		return sum[k];
	}
	pushdown(k,l,r);
	long long ans=0,mid=(r-l+1)/2;
	if (x<=mid)
		ans+=cha(k*2,l,mid,x,y);
	if (y>mid)
		ans+=cha(k*2+1,mid+1,r,x,y);
	return ans;
}
int main() {
	scanf ("%d%d",&n,&m);
	for (int i=1;i<=m;i++){
		scanf ("%d%d%d",&o,&x,&y);
		if (o==0) {
			update(1,1,n,x,y);
		} else {
			cout <<cha(1,1,n,x,y) <<endl;
		}
	}
	return 0;
}
2024/8/15 16:54
加载中...