[悬5r] P10903黄题线段树WA求调,马蜂十分标准
  • 板块灌水区
  • 楼主Const_AKer
  • 当前回复10
  • 已保存回复10
  • 发布时间2024/10/1 22:54
  • 上次更新2024/10/2 10:23:50
查看原帖
[悬5r] P10903黄题线段树WA求调,马蜂十分标准
1038686
Const_AKer楼主2024/10/1 22:54

rtrt
支持微信支付
大概是想着维护区间最小值以及出现次数,但是WA

#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 cnt[N*4],Min[N*4];
	bool t[N*4];
	void pushup(int p)
	{
		if(Min[ls(p)]==Min[rs(p)])
		{
			Min[p]=Min[ls(p)];
			cnt[p]=cnt[ls(p)]+cnt[rs(p)];
		}
		if(Min[ls(p)]<Min[rs(p)])
		{
			Min[p]=Min[ls(p)];
			cnt[p]=cnt[ls(p)];
		}
		if(Min[ls(p)]>Min[rs(p)])
		{
			Min[p]=Min[rs(p)];
			cnt[p]=cnt[rs(p)];
		}
	}
	void addtag(int p,int l,int r,int x)
	{
		Min[p]+=x;	
		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)
		{
			Min[p]=a[l];
			cnt[p]=1;
			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)
		{
			if(Min[p]) return 0;
			else return cnt[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 22:54
加载中...