[codevs1507]酒厂选址

题目←

一开始想到了前缀和优化,发现是n^2,看数据范围没敢打
于是去搜题解……结果发现有人就是这么过的23333
于是代码↓

#include
#include
#include
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!

你可能感兴趣的:(模拟)