真是道好题啊,当时怎么想都没想出来。。。

传送门

简述题意:

有n个点,每个点有一个权值Ai,连接i,j两个点的代价是 |ijD+Ai+A

其中D是给定的常数,问把n个点联通的最小代价

  • 1≤N≤2×$10^{5}$
  • 1≤D≤$10^{9}$
  • 1≤Ai≤$10^{9}$

上来就有个简单粗暴的生成树做法,不过边的数量太多了,肯定做不了。。。

我们需要减少待选边的数量,这里题解给了两种做法,分别体会下吧?

分治

通过分治,将问题变小,如果每个点都向分界线另一边连有边的话,分治下来总边数是nlogn的

再进一步考虑分治的特性,在分治过程中总能抵消掉元素的大小关系,在这里自然选择点的标号

这样左边的点对一条边的贡献设为$f(i)=A_{i}-i*D$

对应的右边是$g(j)=A_{j}+j*D$

这样一条边$(i,j)$就是$f(i)+g(j)$,我们找到左边最小的$f(i_{0})$,右边最小$g(j_{0})$,这样一个左边的点一定连向$j_{0}$,右边的连向$i_{0}$

如何证明这样一定可以连通呢?

按照上面的算法,一条$i!=i_{0}$且$j!=j_{0}$的边不被选,而这时候,有三条边会代替这条边被选$(i,j_{0}),(i_{0},j),(i_{0},j_{0})$(他们都比原边小)

你会发现这三条边会优先于$(i,j)$考虑的话,在生成树算法中就可以保证i,j两点联通

进而对于每个跨过中线的点对都联通了,完成了分治的目的

跑完生成树就是一个$O(Nlog^{2}N)$

关于$A_{i}$

将A数组按顺序放好了之后我们假设A两两不同,这里的左右指标号大小

对于x,我们默认考虑A比他小的边,我们可以证明以下两个结论:

  • 在x左侧所有A比他小的点中,我们只需考虑边权最小的那个
  • 在x右侧所有A比他小的点中,我们只需考虑边权最小的那个

我们先来证第一条。若左侧A比他小的点中最小的边是$(x,y)$,

那么对于每个满足$z<x$且$A_{z}<A_{x}$的z来说,

当$z<y$时,因为$A_{x}+xD>A_{y}+yD$,所以$(x,z)>(y,z)$

当$y<z$时,由$(x,y)<(x,z)$可知有$A_{y}-yD<A_{z}-zD\rightarrow A_{y}-A_{z}-yD+zD<0\rightarrow A_{y}+A_{z}+zD-yD<2A_{z}<A_{z}+A_{x}+xD-zD$

所以$(x,z)>(y,z)$

因此得出对于$(x,z)$有都比他小的两条边$(x,y)$和$(y,z)$代替

所以$(x,z)$并不会作为候选边,第二条的证明是类似的

若有A相等,其实并不会影响太多,比他小的条件改成小于等于也可,

实际上的做法要对A排序,再配合树状数组就可以处理了

这样的话,总边数是的$O(N)$,总复杂度是$O(NlogN)$

atcoder.keyence2019.contest E-Connecting Cities的更多相关文章

  1. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  2. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  3. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  4. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  5. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  6. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  7. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

  8. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

  9. AtCoder Grand Contest 007

    AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...

随机推荐

  1. 洛谷——P1031 均分纸牌

    https://www.luogu.org/problem/show?pid=1031#sub 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以 ...

  2. rsync + inotify 打造多server间文件实时同步

    在上篇文章ssh无password登陆server的基础之上.能够利用rsync + Inotify 在多server间实现文件自己主动同步. 例如以下測试机基于三台server做的.内网IP分别例如 ...

  3. web压力測试-Web Bench

    1.web bench下载.地址:http://home.tiscali.cz/~cz210552/webbench.html 2.wen bench安装: [root@web111 tmp]#tar ...

  4. 加州理工学院公开课:机器学习与数据挖掘_Regularization(第十二课)

    课程简单介绍: 接上一节课,这一节课的主题是怎样利用 Regularization 避免 Overfitting.通过给如果集设定一些限制条件从而避免  Overfitting,可是如果限制条件设置的 ...

  5. C++虚函数默认实参的注意事项

    我们都知道当成员函数是虚函数的时候,函数调用取决于调用函数的对象的类型而不是指针或者应用的类型.这就是C++中的多态. 那么一个虚函数的实参的缺省值是什么呢?例如如下代码: #include < ...

  6. 在Twitter信息流中大规模应用深度学习——推文的相关度计算使用了深度学习

    我们如何对信息流进行排序? 在引入排序算法之前,信息流的组成非常简单:收集所有由你的关注对象在你最后一次登录Twitter之后发送的推文,再将它们按照时间倒序显示出来.这个看起来很简单,但要为数以亿计 ...

  7. hdu 1075(字典树)

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  8. P2932 [USACO09JAN]地震造成的破坏Earthquake Damage 爆搜

    这题怎么这么水~~~本来以为挺难的一道题,结果随便一写就过了...本来还不知道损坏的牛棚算不算,结果不明不白就过了... 题干: 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有 ...

  9. Palindrome(dp)

    http://poj.org/problem?id=1159 题意:给定一个字符,问最少插入多少字符,使该字符串变成回文字符串. 思路:设原字符串序列为X,其逆字符串为Y,则最少插入的字符数=leng ...

  10. Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询

    一:聚合,分组查询 二:F, Q查询