dist[i]表示[0,i)直接选择的数,则每个区间组成一个不等式,题目中要求最小值,则利用u-v>=w的形式求最长路。初始化dist[0]=0;
题目中隐含不等式为0<=dist[u+1]-dist[u]<=1
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
const int inf=10000000;
const int nMax=50009;
int first[nMax],dist[nMax],vis[nMax];
int size,N,M;
struct Edge
{
int v,next,w;
}edge[200005];
void insert(int u,int v,int w)
{
edge[size].v=v;
edge[size].w=w;
edge[size].next=first[u];
first[u]=size++;
}
int spfa(int s)
{
queue<int> Q;
memset(vis,0,sizeof(vis));
for(int i=0;i<=M+1;i++)
dist[i]=(i==0?0:-inf);
Q.push(s);vis[s]=1;
while(!Q.empty())
{
int u=Q.front();Q.pop();
vis[u]=0;
for(int e=first[u];e!=-1;e=edge[e].next)
{
int v=edge[e].v;
if(dist[v]<dist[u]+edge[e].w)
{
dist[v]=dist[u]+edge[e].w;
if(!vis[v])
{
vis[v]=1;Q.push(v);
}
}
}
}
return dist[M+1];
}
int main()
{
// freopen("test.txt","r",stdin);
memset(first,-1,sizeof(first));
size=M=0;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
M=max(M,v);
insert(u,v+1,w);
}
for(int i=0;i<=M;i++)
{
insert(i,i+1,0);
insert(i+1,i,-1);
}
printf("%d\n",spfa(0));
return 0;
}