Bellman-Ford求差分约束。
c i n 超 时 , s c a n f 才 200 m s , 能 用 s c a n f 不 用 c i n \red{cin超时,scanf才200ms,能用scanf不用cin} cin超时,scanf才200ms,能用scanf不用cin
// ShellDawn
// POJ1201
// No.19
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define MM(x) memset(x,0,sizeof(x))
#define INF 0x3f3f3f3f
#define NINF 0xc0c0c0c0
using namespace std;
#define maxn 50005
int n;
struct Edge{
int a;
int b;
int v;
};
Edge E[maxn];
int dis[maxn];
int L,R;
void Bellman_Ford(){
int f = 1;
while(f){
f = 0;
int t;
for(int i=0;i<n;i++){
t = dis[E[i].a] + E[i].v;
if(t < dis[E[i].b]){
dis[E[i].b] = t;
f = 1;
}
}
for(int i=L;i<=R;i++){
t = dis[i-1] + 1;
if(t < dis[i]){
dis[i] = t;
f = 1;
}
}
for(int i=R;i>=L;i--){
t = dis[i];
if(t < dis[i-1]){
dis[i-1] = t;
f = 1;
}
}
}
cout<<dis[R] - dis[L-1]<<endl;
}
int main(){
while(~scanf("%d",&n)){
MM(dis);
L = INF;
R = NINF;
for(int i=0;i<n;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
L = min(L,a);
R = max(R,b);
E[i].a = b;
E[i].b = a-1;
E[i].v = -v;
}
Bellman_Ford();
}
return 0;
}