求hack&&1个想法
查看原帖
求hack&&1个想法
158400
晴空一鹤楼主2022/10/24 19:59
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,z,d,xx,yy,dv[5005],dp[10005],ll=1,tz[5005],ma,ans=214566600141145;
struct no
{
    int x,v,k,op;
    friend bool operator<(no a,no b)
    {
        if(a.x==b.x)
        return a.op>b.op;
        return a.x<b.x;
    }
}t[10005];
void inline r(int &x)
{
    x=0;char c=getchar();int f=1;
    while(c<'0'||c>'9'){
    if(c=='-')
    f=-1;
    c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    x*=f;
}
void inline pri(int x)
{
    if(x>=10)pri(x/10);
    putchar(x%10^48);
}
signed main()
{
    r(n);
    for(int i=1;i<=n;i++)
    {
        r(xx);r(yy);
        t[i*2-1].x=xx,t[i*2].v=t[i*2-1].v=yy-xx,t[i*2-1].k=i,t[i*2-1].op=1;
        t[i*2].x=yy,t[i*2].k=i,t[i*2].op=0;
    }
    sort(t+1,t+2*n+1);
    for(int i=1;i<=2*n;i++)
    dv[t[i].k]=i,dp[i]=200066600000009;
    for(int i=1;i<=2*n;i++){
        if(tz[t[i].k])
        ma=max(ma,tz[t[i].k]),dp[i]=dp[tz[t[i].k]];
        else
        {
        tz[t[i].k]=i;
        if(ma==0)dp[i]=t[i].v;
        else 
        for(int j=ma;j<i;j++)
        dp[i]=min(dp[i],t[i].v+dp[j]);
        ll=i;
        }
    }
    for(int i=ll;i<=2*n;i++)
    ans=min(ans,dp[i]);
    pri(ans);
}

80pts,排序是把左右点拆开排,是假了/写漏了?

另:如果没有第一个条件好像不用dp可以nlogn

2022/10/24 19:59
加载中...