同时还要问一个问题,为什么询问之间的比较改成主食掉的部分就错 #17,现在的却会错 #9 。
到底要怎么排序才是对的?
#include<bits/stdc++.h>
using namespace std;
#define int long long
const double eps=1e-9;
const int maxn=2e5+10;
const int inf=0x3f3f3f3f3f3f3f3f;
struct node{
int from,to,tbe,ted;
bool operator<(const node &a) const{
// if(a.tbe==tbe)
if(ted==a.ted) return tbe<a.tbe;
return ted<a.ted;
// return tbe<a.tbe;
}
}que[maxn];
bool cmp1(node a,node b){
}
struct poi{
int x,y;
poi(int _x=0,int _y=0){
x=_x,y=_y;
}
};
double slope(poi p,poi q){
return (q.y-p.y)*1.0/(q.x==p.x?eps:q.x-p.x);
}
bool cmp(double a,double b){
return a-b>eps;
}
vector<poi> st[maxn];
vector<node> v[maxn];
int dp[maxn];
int get_da(int id,int k,int ti){
int l=0,r=st[id].size()-1;
int p1=0,p2=st[id].size();
while(p1<p2){
int mid=(p1+p2)>>1;
if(st[id][mid].x>ti) p2=mid;
else p1=mid+1;
}
r=p2-1;
if(l>r) return inf;
int res=r;
while(l<=r){
int mid=(l+r)>>1;
if(cmp(k,slope(st[id][mid],st[id][mid+1]))) l=mid+1;
else res=mid,r=mid-1;
}
return st[id][res].y-st[id][res].x*k;
}
void insert(int id,poi da){
int p=st[id].size()-1;
while(p>0&&cmp(slope(st[id][p-1],st[id][p]),slope(st[id][p-1],da))){
st[id].pop_back();
p=st[id].size()-1;
}
st[id].push_back(da);
}
signed main(){
freopen("a.in","r",stdin);
int n,m,A,B,C;
scanf("%lld%lld%lld%lld%lld",&n,&m,&A,&B,&C);
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld%lld",&que[i].from,&que[i].to,&que[i].tbe,&que[i].ted);
}
sort(que+1,que+1+m);
memset(dp,0x3f,sizeof(dp));
dp[1]=0;
insert(1,poi(0,0));
for(int j=1;j<=m;j++){
int i=que[j].to;
node k=que[j];
int q=get_da(k.from,2*A*k.tbe,k.tbe);
if(q!=inf){
int da=q+(A*k.tbe*k.tbe+B*k.tbe+C);
dp[i]=min(dp[i],da+(i==n?k.ted:0));
int x=k.ted,y=da+(A*k.ted*k.ted-B*k.ted);
insert(i,poi(x,y));
}
}
printf("%lld\n",dp[n]);
}