NOI2019D1T1
刚学提高组不久的蒟蒻被逼着打了同步赛,发现T1竟然A了
#include <bits/stdc++.h>
using namespace std;
struct node
{
int from;
int to;
int from_time;
int to_time;
node()
{
}
node(int _a,int _b,int _c,int _d)
{
from=_a,to=_b,from_time=_c,to_time=_d;
}
}q[200005];
bool cmp(node x,node y)
{
if (x.from_time==y.from_time) return x.to_time<y.to_time;
return x.from_time<y.from_time;
}
int read()
{
int x=0;
bool f=0;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')f=1;
c=getchar();
}
while(isdigit(c))
{
x=x*10+c-'0';
c=getchar();
}
if(f)x=-x;
return x;
}
long long n,m,A,B,C,vis[100005][55],sum[100005][55],cnt[100005];
long long ans=1e18;
int main() {
//freopen("route.in","r",stdin);
//freopen("route.out","w",stdout);
memset(vis,0x7fffffffffffffff,sizeof(vis));
memset(sum,0x7fffffffffffffff,sizeof(sum));
vis[1][1]=0;
sum[1][1]=0;
cnt[1]=1;//初始化
n=read(),m=read(),A=read(),B=read(),C=read();
for (int i=0;i<m;i++)
{
int a=read(),b=read(),c=read(),d=read();
q[i]=node(a,b,c,d);
}
sort(q,q+m,cmp);//按到达时间升序排序
for (int i=0;i<m;i++)
{
long long minn=0x7fffffffffffffff;
for (int j=1;j<=cnt[q[i].from];j++)
{
if (vis[q[i].from][j]>q[i].from_time) continue;//如果上一班车到站时间已经晚于这班出发时间,就不用继续循环了
int y=q[i].from_time-vis[q[i].from][j];
minn=min(minn,sum[q[i].from][j]+A*y*y+B*y+C);
}
if (minn!=0x7fffffffffffffff)
{
sum[q[i].to][++cnt[q[i].to]]=minn;
vis[q[i].to][cnt[q[i].to]]=q[i].to_time;
}
}
for (int i=1;i<=cnt[n];i++)ans=min(ans,sum[n][i]+vis[n][i]);
printf("%lld\n",ans);
return 0;
}
最慢的点218ms(还是数据太水才过的)