atcoder.keyence2019.contest E-Connecting Cities
真是道好题啊,当时怎么想都没想出来。。。
简述题意:
有n个点,每个点有一个权值Ai,连接i,j两个点的代价是 |i−j|×D+Ai+Aj
其中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的更多相关文章
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
随机推荐
- [bzoj3524/2223][Poi2014]Couriers_主席树
Couriers bzoj-3524 Poi-2014 题目大意:给定n个数的序列,询问区间内是否存在一个在区间内至少出现了(区间长度>>1)次的数.如果有,输出该数,反之输出0. 注释: ...
- Java端百度云推送消息Demo
因为在做Java服务器有用到推送消息机制,于是到网上找了一下,就自己试着敲了一个demo.这个demo主要是简单的一个对app消息推送. jar:百度云消息推送Java端的jar. package x ...
- HTML-class与id的区别及应用
在样式表定义一个样式的时候,可以定义id也可以定义class. 1.在CSS文件里书写时,ID加前缀"#":CLASS用"." 如只能用id #nav { wi ...
- javac compiling error ( mising package)
javac 编译java源文件时,提示 package does not exist 的错误 Test.java import java.security.MessageDigest; import ...
- Zend_Form 创建、校验和解析表单的基础--(手冊)
1. 创建表单对象 创建表单对象很easy:仅仅要实现 Zend_Form: <?php $form = newZend_Form; ? > 对于高级用例.须要创建 Zend_Form ...
- 通过loosejar清理应用中冗余的jar包
随着应用规模的逐渐增大,依赖的jar包数量也大幅添加.当中不乏多余的,用不到的jar包,占用了大量的宝贵空间.通过loosejar这个工具.便可轻松找到"滥竽充数"的jar包了~ ...
- Oracle 堵塞(blocking blocked)
堵塞是DBA常常碰到的情形,尤其是不良的应用程序设计的堵塞将导致性能严重下降直至数据库崩溃. 对DBA而言,有必要知道怎样定位到当前系统有哪些堵塞,究竟谁是堵塞者,谁是被堵塞者.本文对此给出了描写叙述 ...
- luogu3119 草鉴定
题目大意 给出一个有向图,问将图中的哪一个边翻转,会使节点1所在的强连通分量内的节点数最多.输出这个节点数. 题解 让我们看看暴力怎么做,即枚举每一条边,将其翻转,然后求节点1所在强连通分量节点数,然 ...
- php 图片生成器
一.需求 最近公司由于有大量的海报要做,而且海报的布局规模都是一样的,只是内容不同,所以老板想我开发一个图片的生成器.可以根据你输入的内容生成海报图片. 具体有需求有以下的需求 1.可以根据将每条数据 ...
- jq中append()、prepend()、after()、before()的区别
jq中append().prepend().after().before()的区别详解 .append() - 在被选元素的结尾插入内容(内容的结尾,比如说有个a标签,则是在</a>这个标 ...