线段树求助!蒟蒻样例过不了!第一行输出了二!
查看原帖
线段树求助!蒟蒻样例过不了!第一行输出了二!
494699
卷王慢即快楼主2022/8/10 19:17

线断数求祝!蒟蒻阳历国补聊!敌意行书橱了贰!

#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
int lzy[maxn*4],w[maxn*4];
inline void push_up(int u) {w[u]=w[u<<1]+w[u<<1|1];}
inline bool in_range(int L,int R,int l,int r) {return (l<=L)&&(R<=r);}
inline bool outof_range(int L,int R,int l,int r){return (R<l)||(L>r);}
inline void maketag(int u,int l,int r)
{
	w[u]=r-l+1-w[u];
	lzy[u]=lzy[u]^1;
}
inline void push_down(int u,int L,int R)
{
	if(lzy[u]==0) return;
	int mid=(L+R)>>1;
	maketag(u<<1,L,mid);
	maketag(u<<1|1,mid+1,R);
}
inline int query(int u,int L,int R,int l,int r)
{
	if(in_range(L,R,l,r)) return w[u];
	else if(!outof_range(L,R,l,r))
	{
		int mid=(L+R)/2;
		push_down(u,L,R);
		return query(u<<1,L,mid,l,r)+query(u<<1|1,mid+1,R,l,r);
	}
	else return 0;
}
inline void update(int u,int L,int R,int l,int r)
{
	if(in_range(L,R,l,r)) maketag(u,L,R);
	else if(!outof_range(L,R,l,r))
	{
		int mid=(L+R)>>1;
		push_down(u,L,R);
		update(u<<1,L,mid,l,r);
		update(u<<1|1,mid+1,R,l,r);
		push_up(u);
	}
}
int opt,a,b,n,m;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		if(opt==0)
		{
			cin>>a>>b;
			update(1,1,n,a,b);
		}
		else
		{
			cin>>a>>b;
			cout<<query(1,1,n,a,b)<<endl;
		}
	}
	return 0;
}

谁能帮帮我?

2022/8/10 19:17
加载中...