求调,玄关
查看原帖
求调,玄关
515836
__Louis__楼主2025/1/22 15:45

同时还要问一个问题,为什么询问之间的比较改成主食掉的部分就错 #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]);
} 
2025/1/22 15:45
加载中...