一开始想到了前缀和优化,发现是n^2,看数据范围没敢打
于是去搜题解……结果发现有人就是这么过的23333
于是代码↓
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const long long MAXN = 200000 + 50;
long long dis1[MAXN],dis2[MAXN];
long long n,w[MAXN],v[MAXN];
long long get_dis1(long long now,long long x)
{
if(x < now)return dis1[now] - dis1[x];
else return dis1[now] + dis2[x];
}
long long get_dis2(long long now,long long x)
{
if(x > now)return dis2[now] - dis2[x];
else return dis2[now] + dis1[x];
}
long long ans;
void check(long long now)
{
long long tot = 0;
for(long long i = 1;i <= n;i ++)
{
if(i == now)continue;
tot += w[i] * min(get_dis1(now,i),get_dis2(now,i));
}
if(!ans)ans = tot;
else if(tot < ans)ans = tot;
}
int main()
{
scanf("%lld",&n);
for(long long i = 1;i <= n;i ++)
{
scanf("%lld%lld",&w[i],&v[i]);
dis1[i] = dis1[i - 1] + v[i - 1];
}
for(long long i = n;i >= 1;i --)
{
dis2[i] = dis2[i + 1] + v[i];
}
for(long long i = 1;i <= n;i ++)
{
check(i);
}
printf("%lld",ans);
return 0;
}
wyh:我的n^2可以过100000!
本文介绍了一种使用前缀和优化算法解决特定问题的方法。通过计算前缀和数组,实现快速查询任意两点间的距离,进而求得最小总代价。文章包含完整的C++代码实现,并通过实例展示了算法的有效性。
1414

被折叠的 条评论
为什么被折叠?



