求助帖P3879
查看原帖
求助帖P3879
533181
Su_xu楼主2024/8/13 15:01

求助 样例输出0;

#include<bits/stdc++.h>
using namespace std;
struct node
{
	long long l,r,sum;
	bool rag;
}t[1000010];
int n,m,x,y,z;
void push_down(int rt)
{
	if(t[rt].rag)
	{
		int mid=t[rt].l+t[rt].r>>1;
		t[rt<<1].sum=(t[rt<<1].r-t[rt<<1].r+1)-t[rt<<1].sum;
		t[rt<<1|1].sum=(t[rt<<1|1].r-t[rt<<1|1].r+1)-t[rt<<1|1].sum;
		t[rt<<1].rag^=1;
		t[rt<<1|1].rag^=1;
		t[rt].rag=0;
	}
	return;
} 
void build(int rt,int l,int r)
{
	t[rt].l=l;
	t[rt].r=r;
	if(l==r)
	{
		t[rt].sum=0;
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
	return;
}
void revise(int l,int r,int rt)
{
	if(l>=t[rt].l&&t[rt].r<=r)
	{
		t[rt].sum=(t[rt].r-t[rt].l+1)-t[rt].sum;
		t[rt].rag^=1;
		return;
	}
	int mid=l+r>>1;	
	push_down(rt);
	if(t[rt<<1].l  <=r||t[rt<<1].r  >=l)	revise(l,r,rt<<1);
	if(t[rt<<1|1].l<=r||t[rt<<1|1].r>=l)	revise(l,r,rt<<1|1);
	return;
}
long long clac(int l,int r,int rt)
{
	if(l>=t[rt].l&&t[rt].r<=r)
	{
		return t[rt].sum;
	}
	push_down(rt);
	long long kk=0;
	int mid=l+r>>1;
	if(t[rt<<1].l<=r||t[rt<<1].r>=l)
	kk+=clac(l,mid,rt<<1);
	if(t[rt<<1|1].l<=r||t[rt<<1|1].r>=l)
	kk+=clac(mid+1,r,rt<<1|1);
	return kk;
}
int main()
{
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(x==0)
		{
			revise(y,z,1);
		}
		else cout<<clac(y,z,1)<<endl;
	}
}
2024/8/13 15:01
加载中...