求助
查看原帖
求助
171890
chentianyi楼主2020/5/23 21:34

为什么这代码连样例都过不去 求助奆佬

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m;
struct tree
{
	int l,r,add,sum;
}t[N*4];
void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r)
	{
		t[p].sum=0;
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}
void spread(int p)
{
	if(!t[p].add) return;
	t[p*2].sum=t[p*2].r-t[p*2].l+1-t[p*2].sum;
	t[p*2+1].sum=t[p*2+1].r-t[p*2+1].l+1-t[p*2+1].sum;
	t[p*2].add^=1;
	t[p*2+1].add^=1;
	t[p].add=0;
	return;
}
void change(int p,int l,int r)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].sum+=t[p].r-t[p].l+1-t[p].sum;
		t[p].add^=1;
		return;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) change(p*2,l,r);
	if(r>mid) change(p*2+1,l,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
	return;
}
int ask(int p,int l,int r)
{
	if(l<=t[p].l&&r>=t[p].r) return t[p].sum;
	spread(p);
	int mid=(t[p].l+t[p].r)/2,val=0;
	if(l<=mid) val+=ask(p*2,l,r);
	if(r>mid) val+=ask(p*2+1,l,r);
	return val;
}
int main()
{
	cin>>n>>m;
	build(1,1,n);
	int c,x,y;
	for(int T=1;T<=m;T++)
	{
		scanf("%d%d%d",&c,&x,&y);
		if(c==0) change(1,x,y);
		else if(c==1) printf("%d\n",ask(1,x,y));
	}
 	return 0;
}

2020/5/23 21:34
加载中...