此题求的是最小值,用最长路;
用A-B>=x建边;
注意
1.[a,b]区间至少取c个,即b-(a-1)>=c;
a-1,如果a=0的话超界,所以所有的a,和b都加1;
2.对于i和i-1;
0<=i-(i-1)<=1;
3.可以把最小的a找出,节约时间。
//wa,re...了全是数组开小了!!,表示q一开始只开了十万;;;;
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,maxx,minn=1e9;
int dis[50005],q[1000005],vis[50005];
int h[50005],tov[200000],tow[200000],nex[200000],tp;
void add(int x,int y,int w)
{
tp++;
tow[tp]=w;
tov[tp]=y;
nex[tp]=h[x];
h[x]=tp;
}
void spfa()
{
for(int i=minn;i<=maxx;i++)
dis[i]=-1;//赋初值啊!
int tail=1,head=0;
q[tail]=minn;
dis[minn]=0;
vis[minn]=1;
while(head<tail)
{
head++;
int x=q[head];
for(int i=h[x];i;i=nex[i])
{
int v=tov[i];
if(dis[v]<dis[x]+tow[i])
{
dis[v]=dis[x]+tow[i];
if(vis[v]==0)
{
vis[v]=1;
tail++;
q[tail]=v;
}
}
}
vis[x]=0;
}
cout<<dis[maxx];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x, y, w;
scanf("%d%d%d",&x,&y,&w);
add(x,y+1,w);
maxx=max(y+1,maxx);
minn=min(x,minn);
}
for(int i=minn+1;i<=maxx;i++)
{
add(i,i-1,-1);
add(i-1,i,0);
}
spfa();
return 0;
}