线段树求调
查看原帖
线段树求调
539133
q1uple楼主2022/11/5 13:52
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=5e5+5;
struct node{
	int l,r,lzy,sum;
}t[4*maxn];
void push(int u)
{
    t[u].sum=t[u*2].sum+t[u*2+1].sum;
}
void build(int u,int l,int r)
{
	if(l==r)
	{
		t[u].sum=0;
		t[u].l=t[u].r=l;
		return;
	}
	t[u].l=l,t[u].r=r;
	int mid=(l+r)/2;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    push(u);
}
void maketag(int u,int len)
{
	t[u].sum=len-t[u].sum;
	t[u].lzy^=1;
}
void pushdown(int u)
{
	if(t[u].lzy!=0)
	{
		maketag(u*2,t[u*2].r-t[u*2].l+1);
		maketag(u*2+1,t[u*2+1].r-t[u*2+1].l+1);
		t[u].lzy=0;
	}
}


int range(int u,int l,int r)
{
	if(t[u].l>=l&&t[u].r<=t[u].r)
		return t[u].sum;
	if(t[u].l>r||t[u].r<l)
		return 0;
	pushdown(u);
	return range(u*2,l,r)+range(u*2+1,l,r);
}
void update(int u,int l,int r)
{
	if(t[u].l>=l&&t[u].r<=t[u].r)
		maketag(u,t[u].r-t[u].l+1);
	else if(t[u].l>r||t[u].r<l)
	{
		return;
	}
	else
	{
		pushdown(u);
        update(u*2,l,r);
        update(u*2+1,l,r);
        push(u);
	}
}
signed main()
{
	int n,m;
	cin>>n>>m;
	build(1,1,n);
	while(m--)
	{
		int c,a,b;
		cin>>c>>a>>b;
		if(c==0)
		{
			update(1,a,b);
		}
		if(c==1)
		{
			cout<<range(1,a,b)<<'\n';
		}
	}
	return 0;
}
2022/11/5 13:52
加载中...