只A了第二个点,求大佬帮看看
查看原帖
只A了第二个点,求大佬帮看看
1018077
CZYCZY1104楼主2024/7/17 20:11
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
	int l,r,add,sum;
}a[400005];
void build(int p,int l,int r)
{
	a[p].l=l,a[p].r=r,a[p].add=0,a[p].sum=0;
	if(l==r)
		return;
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	a[p].sum=a[p<<1].sum+a[p<<1|1].sum;
}
void pushdown(int p)
{
	if(a[p].add)
	{
		a[p<<1].add^=1;
		a[p<<1|1].add^=1;
		a[p<<1].sum=a[p<<1].r-a[p<<1].l+1-a[p<<1].sum;
		a[p<<1|1].sum=a[p<<1|1].r-a[p<<1|1].l+1-a[p<<1|1].sum;
		a[p].add=0;
	}
}
void update(int p,int l,int r)
{
	if(a[p].l==l&&a[p].r==r)
	{
		a[p].sum=a[p<<1].r-a[p<<1|1].l+1-a[p].sum;
		a[p].add^=1;
		return;
	}
	pushdown(p);
	int mid=(a[p].l+a[p].r)>>1;
	if(r<=mid) update(p<<1,l,r);
	else if(l>mid) update(p<<1|1,l,r);
	else
	{
		update(p<<1,l,mid);
		update(p<<1|1,mid+1,r);
	}
	a[p].sum=a[p<<1].sum+a[p<<1|1].sum;
}
int query(int p,int l,int r)
{
	if(a[p].l==l&a[p].r==r) return a[p].sum;
	pushdown(p);
	int mid=(a[p].l+a[p].r)>>1;
	if(r<=mid) return query(p<<1,l,r);
	else if(l>mid) return query(p<<1|1,l,r);
	else return query(p<<1,l,mid)+query(p<<1|1,mid+1,r);
}
int main()
{
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int c,x,y;
		cin>>c>>x>>y;
		if(c==0)
		{
			update(1,x,y);
		}
		else
		{
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2024/7/17 20:11
加载中...