60pts求助
查看原帖
60pts求助
244294
__Chtholly楼主2023/7/16 16:51
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long 

const ll N=3005;
ll n,m;
ll a1[N],b1[N];
ll val[N];
ll a[N],b[N];
ll ans;

struct node{
	ll l,r,tag,num;
}Tree[N<<2];

void build(ll l,ll r,ll rt){
	Tree[rt].l=l,Tree[rt].r=r;
	if(l==r)return ;
	ll m=(l+r)/2;
	build(l,m,rt<<1),build(m+1,r,rt<<1|1);
}

void pushdown(ll rt){
	if(Tree[rt].num){
		Tree[rt<<1].num=Tree[rt].num;
		Tree[rt<<1|1].num=Tree[rt].num;
		Tree[rt].num=0;
	}
	return ;
}

void update(ll rt,ll L,ll R,ll val){
	ll l=Tree[rt].l,r=Tree[rt].r;
	if(r<L||l>R)return ;
	if(L<=l&&r<=R){
		Tree[rt].num=val;
		return ;
	}
	pushdown(rt);
	update(rt<<1,L,R,val);
	update(rt<<1|1,L,R,val);
	return ;
}

ll cnt[N<<1];

void pushit(ll rt){
	if(Tree[rt].l==Tree[rt].r)return ;
	pushdown(rt);
	pushit(rt<<1),pushit(rt<<1|1);
}

void findit(ll rt){
	if(Tree[rt].l==Tree[rt].r){
		cnt[Tree[rt].l]=Tree[rt].num;
		return ;
	}
	pushdown(rt);
	findit(rt<<1),findit(rt<<1|1);
}

bool tmp[N<<2];
signed main(){
	scanf("%lld%lld",&n,&m);
	for(register ll i=1;i<=m;++i){
		scanf("%lld%lld",&a1[i],&b1[i]);
		val[i*2-1]=a1[i];
		val[i*2]=b1[i];
	}
	val[2*m+1]=n;
	sort(val+1,val+1+m*2+1);
	ll tot=unique(val+1,val+1+2*m+1)-val-1;
	for(register ll i=1;i<=m;++i){
		ll pos1,pos2;
		pos1=lower_bound(val+1,val+1+tot,a1[i])-val;
		pos2=lower_bound(val+1,val+1+tot,b1[i])-val;
		a[i]=pos1;
		b[i]=pos2;
	}
	n=lower_bound(val+1,val+1+tot,n)-val;
	build(1,n,1);
	for(register ll i=1;i<=m;++i)
		update(1,a[i],b[i],i);
	for(register ll i=1;i<=m;++i)pushit(1);
	findit(1);
	for(register ll i=1;i<=n;++i)
		if(!tmp[cnt[i]] && cnt[i])
			ans++,tmp[cnt[i]]=1;
	printf("%lld\n",ans);
	return 0;
}

2023/7/16 16:51
加载中...