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;
    }
    

      

  • 相关阅读:
    [NOI Online #3 提高组]
    Luogu P3491 [POI2009]SLW-Words
    AtCoder Grand Contest 043
    Luogu P5607 [Ynoi2013]无力回天NOI2017
    AtCoder Grand Contest 041
    Luogu P5070 [Ynoi2015]即便看不到未来
    BZOJ 4367: [IOI2014]holiday假期
    BZOJ 3571: [Hnoi2014]画框
    BZOJ 4456: [Zjoi2016]旅行者
    BZOJ 1111: [POI2007]四进制的天平Wag
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/12493099.html
Copyright © 2011-2022 走看看