玄关,线段树全输出0求调(马蜂良好且标准)
查看原帖
玄关,线段树全输出0求调(马蜂良好且标准)
1038686
Const_AKer楼主2024/10/1 21:48

rtrt

#include<bits/stdc++.h>
#define ls(x) (x<<1)
#define rs(x) ((x<<1)+1)
#define mid ((l+r)>>1)
using namespace std;
const int N=300005;
int n,m,i,a[N],l[N],r[N];
struct sqt
{
	int s[N*4],sum_0[N*4];
	bool t[N*4];
	void pushup(int p)
	{
		s[p]=s[ls(p)]+s[rs(p)];
		sum_0[p]=sum_0[ls(p)]+sum_0[rs(p)];
	}
	void addtag(int p,int l,int r,int x)
	{
		s[p]+=(r-l+1)*x;
		if(!s[p]) sum_0[p]=r-l+1;
		t[p]+=x;
		pushup(p);
	}
	void pushdown(int p,int l,int r)
	{
		if(!t[p]) return;
		addtag(ls(p),l,mid,t[p]);
		addtag(rs(p),mid+1,r,t[p]);
		t[p]=0;
	}
	void build(int p,int l,int r)
	{
		if(l==r)
		{
			s[p]=a[l];
			return;
		}
		build(ls(p),l,mid);
		build(rs(p),mid+1,r);
		pushup(p);
	}
	void add(int p,int l,int r,int L,int R,int x)
	{
		if(L>r||R<l) return;
		if(L<=l&&r<=R) return addtag(p,l,r,x); 
		pushdown(p,l,r);
		add(ls(p),l,mid,L,R,x);
		add(rs(p),mid+1,r,L,R,x);
		pushup(p);
	}
	int ask(int p,int l,int r,int L,int R)
	{
		if(L>r||R<l) return 0;
		if(L<=l&&r<=R) return sum_0[p];
		pushdown(p,l,r);
		return ask(ls(p),l,mid,L,R)+ask(rs(p),mid+1,r,L,R);
	}
}Sqt;
int main()
{
	cin>>n>>m;
	Sqt.build(1,1,n);
	for(i=1;i<=m;i++)
	{
		cin>>l[i]>>r[i];
		Sqt.add(1,1,n,l[i],r[i],1);
	}
	for(i=1;i<=m;i++)
	{
		Sqt.add(1,1,n,l[i],r[i],-1);
		cout<<Sqt.ask(1,1,n,1,n)<<'\n';
		Sqt.add(1,1,n,l[i],r[i],1);
	}
	return 0;
}
2024/10/1 21:48
加载中...