对 比 阅 读
查看原帖
对 比 阅 读
149192
__gcd楼主2020/11/6 17:36

上面是我同学AC的代码,下面是我根据他的代码,改道几乎只有马蜂不同的代码,但是仍然WA on 22

#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],b[100005],dp[100005]; 
long long up(int q,int p){
	return dp[p]-dp[q];
}
long long down(int q,int p){
	return b[q]-b[p];
}
double make(int q,int p){
	return 1.0*up(q,p)/down(q,p);
}
int q[100005];
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
	int l=1,r=1;
	q[1]=1;
	for(long long i=2;i<=n;i++){
		while(l<r&&make(q[l],q[l+1])<1ll*a[i]) l++;
		dp[i]=dp[q[l]]+1ll*a[i]*b[q[l]];
		while(l<r&&make(q[r-1],q[r])>make(q[r],i)) r--;
		q[++r]=i; 
	}
	cout<<dp[n];
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
long long n, a[100005], b[100005], dp[100005];
long long up(int q, int p)
{
	return dp[p] - dp[q];
}
long long down(int q, int p)
{
	return b[q] - b[p];
}
double make(int q, int p)
{
	return 1.0 * up(q, p) / down(q, p);
}
int q[100005];
int main()
{
	scanf("%lld", &n);
	for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	for(int i = 1; i <= n; i++) scanf("%lld", &b[i]);
	int l = 1, r = 1;
	q[1] = 1;
	for(long long i = 2; i <= n; i++)
	{
		if(l < r && make(q[l], q[l + 1]) < 1ll * a[i]) l++;
		dp[i] = dp[q[l]] + 1LL * a[i] * b[q[l]];
		while(l < r && make(q[r - 1], q[r]) > make(q[r], i)) r--;
		q[++r] = i;	 
	}	
	cout << dp[n];
	return 0;
}

2020/11/6 17:36
加载中...