用的线段树,只能过样例2,求调!!!
查看原帖
用的线段树,只能过样例2,求调!!!
1150009
cz_Huang楼主2024/9/4 12:24
#include<bits/stdc++.h>
using namespace std;

#define g 800000+7
#define ll long long

ll n,m;
struct segmentTree
{
	struct Node{
		ll l,r,num,lz;
	} tr[g*4];
	void Build(ll pos,ll l,ll r)
	{
		tr[pos].l=l;
		tr[pos].r=r;
		tr[pos].lz=0;
		tr[pos].num=0;
		if(l==r) return;
		ll mid=l+r>>1;
		Build(pos<<1,l,mid);
		Build(pos<<1|1,mid+1,r);
	}
	void Push_Down(ll pos)
	{
		ll temp=tr[pos].lz;
		tr[pos].lz=0;
		if(temp!=0)
		{
			tr[pos<<1].lz+=temp;
			Switch(pos<<1);
			tr[pos<<1|1].lz+=temp;
			Switch(pos<<1|1);	
		}
	}
	void Switch(ll pos)
	{
		if(tr[pos].lz%2)
			tr[pos].num=tr[pos].r-tr[pos].l+1-tr[pos].num;
		if(tr[pos].l==tr[pos].r) tr[pos].lz=0;
		return;
	}
	void Modify(ll pos,ll dl,ll dr)
	{
		if(tr[pos].l>=dl&&tr[pos].r<=dr)
		{
			tr[pos].lz++;                                                                                                                                   
			Switch(pos); 
			return;
		}
		Push_Down(pos);
		ll mid=tr[pos].l+tr[pos].r>>1;
		if(mid>=dl) Modify(pos<<1,dl,dr);
		if(mid+1<=dr) Modify(pos<<1|1,dl,dr);
		tr[pos].num=tr[pos<<1].num+tr[pos<<1|1].num;
	}
	ll Query(ll pos,ll dl,ll dr)
	{
		if(tr[pos].l>=dl&&tr[pos].r<=dr)
			return tr[pos].num; 
		Push_Down(pos);
		ll mid=tr[pos].l+tr[pos].r>>1;
		ll ans=0;
		if(mid>=dl) ans+=Query(pos<<1,dl,dr);
		if(mid+1<=dr) ans+=Query(pos<<1|1,dl,dr);
		return ans;
	}
} ST;

int main(void)
{
	cin>>n>>m;
	ST.Build(1,1,n);
	for(int i=0;i<m;i++)
	{
		int c,x,y;
		cin>>c;
		if(c==0)
		{
			cin>>x>>y;
			ST.Modify(1,x,y);
		}
		else
		{
			cin>>x>>y;
			cout<<ST.Query(1,x,y)<<endl;
		}
	}
	return 0;
}
2024/9/4 12:24
加载中...