离散化实现略,直接代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAX_L = 2000001;
long long f[MAX_L];
struct pnode
{
int id;
int times;
bool isleft;
long long value;
}p[MAX_L];
long long times;
long long ans = 0;
struct node
{
long long x,y,w;
}r[MAX_L];
int N;
bool cmp(struct node a,struct node b)
{
return (a.y<=b.y);
}
bool cmpp(struct pnode a,struct pnode b)
{
return (a.value<=b.value);
}
int init()
{
scanf("%d",&N);
int i,j;
for (i=1;i<=N;i++)
{
scanf("%lld %lld %lld",&r[i].x,&r[i].y,&r[i].w);
p[i*2-1].value=r[i].x;
p[i*2].value=r[i].y;
p[i*2-1].isleft=true;
p[i*2-1].id=p[i*2].id=i;
}
sort(p+1,p+N*2+1,cmpp);
i=1;
while (i<=2*N)
{
j=i;
times++;
p[j].times=times;
j++;
while (p[j].value==p[i].value&&j<=2*N)
{
p[j].times=times;
j++;
}
i=j;
}
for (i=1;i<=2*N;i++)
if (p[i].isleft) r[p[i].id].x=p[i].times;
else r[p[i].id].y=p[i].times;
sort(r+1,r+N+1,cmp);
}
int work()
{
int i;
int j=0;
int k;
for (i=1;i<=N;i++)
{
if (r[i].y!=j)
{
for (k=j+1;k<=r[i].y;k++)
f[k]=f[j];
j=r[i].y;
}
f[r[i].y]=max(f[r[i].y],f[r[i].x]+r[i].w);
}
}
int put()
{
int i;
for (i=0;i<MAX_L;i++)
ans=max(ans,f[i]);
printf("%lld",ans);
}
int main()
{
init();
work();
put();
return 0;
}