Description
给你
n
个闭区间
Input
第一行一个整数
下接
n
行每行三个整数
n<=1000
,
0<=ai,bi<=1000
,
0<=ci<=bi−ai+1
Output
一个整数,表示最小的
k
。
Sample Input
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1
Sample Output
6
HINT
思路
好吧。。。一开始弄的我又RE又TLE的。。。数据范围是假的,
sumbi−sumai−1>=ci0<=sumi−sumi−1<=1
那么对于每个
i<=n
,
bi
向
ai−1
连一条权值为
−c
的边,同时对于每个
0<i<=maxb
,
i
向代码
#include <cstdio>
#include <cstring>
const int maxn=50000;
int pre[(maxn<<2)+10],now[maxn+10],son[(maxn<<2)+10],tot,val[(maxn<<2)+10];
int head,tail,q[maxn+10],dist[maxn+10],b[maxn+10],n,m;
int ins(int a,int b,int c)
{
tot++;
pre[tot]=now[a];
now[a]=tot;
son[tot]=b;
val[tot]=c;
return 0;
}
int spfa(int s)
{
head=0;
tail=1;
memset(dist,63,sizeof dist);
dist[s]=0;
b[s]=1;
q[1]=s;
while(head!=tail)
{
head++;
if(head>n)
{
head=0;
}
int u=q[head],j=now[u];
while(j)
{
int v=son[j];
if(dist[v]>dist[u]+val[j])
{
dist[v]=dist[u]+val[j];
if(!b[v])
{
b[v]=1;
tail++;
if(tail>n)
{
tail=0;
}
q[tail]=v;
}
}
j=pre[j];
}
b[u]=0;
}
return 0;
}
int main()
{
scanf("%d",&m);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
ins(b,a-1,-c);
if(b>n)
{
n=b;
}
}
for(int i=1; i<=n; i++)
{
ins(i-1,i,1);
ins(i,i-1,0);
}
spfa(n);
printf("%d\n",-dist[0]);
return 0;
}