zoukankan      html  css  js  c++  java
  • 牛客练习赛59 B

    链接:https://ac.nowcoder.com/acm/contest/4743/B
    来源:牛客网

         在牛国有个小镇编号。用二维平面来表示每个小镇的位置,第个小镇的位置为。牛能做为牛国的国王,决定给小镇之间建设一些道路,以便于任意小镇之间都能相互到达,在第i个小镇和第j个小镇之间建设一条道路的花费是

    但是牛能小气的很,他想最小化建设的费用。

    首先想到的是,最小生成树,然而这道题给的内存及其小,用堆优化是超限的,我们叫要再从,路径长短看起,这是一个绝对式,是关于每个点 v[i] = x_i^2 * y_i + y_i^2 * (y_i - 2 * x_i) , 则dis(i, j) = | v[i] - v[j] |,我们注意到

    | |a| - |b| | leqslant | a - b | leqslant  |a| + |b|, 我们就发现了 对于三个点 i,j,k, 则其小生成树花费为 |v[i] - v[j]| + |v[i] - v[k]| (|v[j] - v[i]| + |v[j] - v[k]|、|v[k] - v[i] | + |v[k] - v[j]|)  geqslant |v[i] - v[j] - v[j] + v[k]| = |v[j] - v[k]| (|v[i] - v[k]|、|v[i] - v[j]|),

    所以i先排序 v[i],答案就是 v[n] - v[i] ,(最小生成树过不了)

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
     
    const int maxn = 1e5 + 5;
     
    int t, n, m, tot;
    ll a, b, v[maxn];
     
    int main()
    {
         scanf("%d", &n);
         for (int i = 1; i <= n; ++i)
         {
             scanf("%lld%lld", &a, &b);
             v[i] = a * a * b+ b * b * (b - a* 2);
         }
         sort(v + 1, v + 1 + n);
         printf("%lld", v[n] - v[1]);
         return 0;
    }
    

      

  • 相关阅读:
    定时器
    javascript之循环保存数值
    Web 前端之HTML和CSS
    [讲解]容斥原理
    [vijos1048]送给圣诞夜的贺卡<DFS剪枝>
    [vijos1145]小胖吃巧克力<概率dp>
    [noip2012]国王游戏<贪心+高精度>
    [codevs3118]高精度除法<高精度>
    [noip2016]组合数问题<dp+杨辉三角>
    [codevs2370]小机房的树<LCA>
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/12493099.html
Copyright © 2011-2022 走看看