线段树优化DP90pts求调
查看原帖
线段树优化DP90pts求调
665533
HYJ37567楼主2025/1/22 09:28

rt

#include<bits/stdc++.h>
using namespace std;
const long long MAXN=100005;
long long n,l,r,f[MAXN],t[MAXN*4];
struct data
{
    long long a,b,c;
}a[MAXN];
bool cmp(data a,data b)
{
    return a.b<b.b;
}
void pushup(long long x)
{
	t[x]=min(t[x*2],t[x*2+1]);
}
void BuildTree(long long p,long long l,long long r)
{
    if(l==r)
	{
        t[p]=f[l];
        return;
    }
    long long mid=(l+r)/2;
    BuildTree(p*2,l,mid);
    BuildTree(p*2+1,mid+1,r);
    pushup(p);
}
void Update(long long p,long long x,long long v,long long L,long long R)
{
    if(L==R)
	{
        t[p]=v;
        return;
    }
    long long mid=(L+R)/2;
    if(x<=mid) Update(p*2,x,v,L,mid);
    else Update(p*2+1,x,v,mid+1,R);
    pushup(p);
}
long long inquire(long long p,long long l,long long r,long long L,long long R)
{
    if(l<=L&&r>=R) return t[p];
    long long mid=(L+R)/2;
    long long val=INT_MAX;
    if(l<=mid) val=min(val,inquire(p*2,l,r,L,mid));
    if(r>mid) val=min(val,inquire(p*2+1,l,r,mid+1,R));
    return val;
}
int main()
{
    scanf("%lld%lld%lld",&n,&l,&r);
    for(int i=1;i<=n;i++)
	{
        scanf("%lld%lld%lld",&a[i].a,&a[i].b,&a[i].c);
    }
    sort(a+1,a+n+1,cmp);
    memset(f,0x3f3f3f3f,sizeof(f));
    f[l]=0;
    BuildTree(1,l,r);
    for(int i=1;i<=n;i++)
	{
        f[a[i].b]=min(f[a[i].b],inquire(1,a[i].a-1,a[i].b,l,r)+a[i].c);
        Update(1,a[i].b,f[a[i].b],l,r);
        if(a[i].b>=r)
		{
            if(f[a[i].b]==0x3f3f3f3f) printf("-1\n");
			else printf("%lld\n",f[a[i].b]);
            return 0;
        }
    }
    return 0;
}

记录详情

2025/1/22 09:28
加载中...