求调线段树DP
查看原帖
求调线段树DP
767861
Melo_BBB楼主2023/11/5 09:43

莫名其妙 MLE 掉了。

#include<bits/stdc++.h>
using namespace std;
const int N=1000001,INF=0x3f3f3f3f;
int n,t,f[N<<1],tot,cur,ls[N<<1],rs[N<<1],ans=INF;
struct node{
	int l,r;
	bool operator<(node b){
	    return(r!=b.r?r<b.r:l<b.l);
	}
}a[25001];
void pushup(int x){
	f[x]=min(f[ls[x]],f[rs[x]]);
	return;
}
void build(int l,int r,int&cur){
	cur=++tot;
	if(l==r){
		f[cur]=INF;
		return;
	}
	int mid=l+r>>1; 
	return build(l,mid,ls[cur]),build(mid+1,r,rs[cur]),pushup(cur);
}
int qry(int l,int r,int ql,int qr,int cur){
	if(ql<=l&&r<=qr)
		return f[cur];
	int mid=l+r>>1,ans=INF;
	if(ql<=mid)
		ans=min(ans,qry(l,mid,ql,qr,ls[cur]));
	if(mid<qr)
		ans=min(ans,qry(mid+1,r,ql,qr,rs[cur]));
	return ans;
}
void modify(int l,int r,int qc,int x,int cur){
	if(l==r){
		f[cur]=min(f[cur],x);
		return;
	}
	int mid=l+r>>1;
	if(qc<=mid)
		modify(l,mid,qc,x,ls[cur]);
	else
		modify(mid+1,r,qc,x,rs[cur]);
	return pushup(cur);
}
int main(){
	cin>>n>>t;
	build(1,t,cur);
	for(int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
		if(a[i].l==1)
		    modify(1,n,a[i].r,1,1);
	}
	sort(a+1,a+n+1);
	for(int i=1,k;i<=n;i++)
		modify(1,n,a[i].r,min(qry(1,n,a[i].l-1,a[i].r-1,1)+1,qry(1,n,a[i].r,a[i].r,1)),1);
	ans=qry(1,n,t,t,1);
	if(ans==INF)
        cout<<-1;
	else
        cout<<ans;
	return 0;
}
2023/11/5 09:43
加载中...