一开始想到了前缀和优化,发现是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!