题目传送门


考虑如何去掉这个绝对值,

换句话说,如何减少边数并且能建出 MST。

在求解偏序问题时,往往会分而治之,

这样原来 \(O(n^2)\) 的做法就能够被优化。

考虑将所有点对半折开,

左半部分和右半部分的建边分治处理,

只考虑横跨两部分的建边,

若左半部分的点为 \(j\),右半部分的点为 \(i\)

边权就可以转换成:

\[(A_i+i\times d)+(A_j-j\times d)
\]

既然 \(i\) 和 \(j\) 独立出来,那么只需要选出

右半部分 \(\min\{A_i+i\times d\}\) 所对应的 \(i\),

左半部分 \(\min\{A_j-j\times d\}\) 所对应的 \(j\),

将 \(j\) 与右半部分所有点连边,\(i\) 同理。

那么这样就只有 \(O(n\log n)\) 条边,

用 Kruskal 跑最小生成树就可以做到 \(O(n\log^2n)\)。


Code

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011; typedef long long lll;
struct node{int x,y; lll w;}e[N<<5];
lll a[N],b[N],D,ans; int n,f[N],m;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
bool cmp(node x,node y){return x.w<y.w;}
inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
inline void dfs(int l,int r){
if (l==r) return;
rr int mid=(l+r)>>1,t0=l,t1=r;
for (rr int i=l;i<=mid;++i)
if (a[t0]>a[i]) t0=i;
for (rr int i=r;i>mid;--i)
if (b[t1]>b[i]) t1=i;
for (rr int i=l;i<=mid;++i)
e[++m]=(node){i,t1,a[i]+b[t1]};
for (rr int i=r;i>mid;--i)
e[++m]=(node){t0,i,a[t0]+b[i]};
dfs(l,mid),dfs(mid+1,r);
}
signed main(){
n=iut(),D=iut();
for (rr int i=1;i<=n;++i){
rr int x=iut(); f[i]=i;
a[i]=x-i*D,b[i]=x+i*D;
}
dfs(1,n),sort(e+1,e+1+m,cmp);
for (rr int i=1;i<=m;++i){
rr int fa=getf(e[i].x),fb=getf(e[i].y);
if (fa!=fb) f[fa]=fb,ans+=e[i].w;
}
return !printf("%lld",ans);
}

#Kruskal,分治#AT4569 Connecting Cities的更多相关文章

  1. 【LeetCode】1135. Connecting Cities With Minimum Cost 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Kruskal算法 日期 题目地址:https://l ...

  2. AtCoder keyence2019 E Connecting Cities

    keyence2019_e $N$ 个节点的无向图 $G$,节点 $i,j$ 之间的边权值为 $|i - j| \times D + A_i + A_j$ . 求最小生成树(Minimum Spann ...

  3. LeetCode 1135. Connecting Cities With Minimum Cost

    原题链接在这里:https://leetcode.com/problems/connecting-cities-with-minimum-cost/ 题目: There are N cities nu ...

  4. KEYENCE Programming Contest 2019 Solution

    A - Beginning 签到. #include <bits/stdc++.h> using namespace std; int main() { ]; while (scanf(& ...

  5. HDU 4126 Genghis Khan the Conqueror 最小生成树+树形dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 Genghis Khan the Conqueror Time Limit: 10000/50 ...

  6. hdu4126_hdu4756_求最小生成树的最佳替换边_Kruskal and Prim

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:  Portal: hdu4126 hdu4756  原题目 ...

  7. hdu4126Genghis Khan the Conqueror (最小生成树+树形dp)

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others) Total Submiss ...

  8. 【LeetCode】代码模板,刷题必会

    目录 二分查找 排序的写法 BFS的写法 DFS的写法 回溯法 树 递归 迭代 前序遍历 中序遍历 后序遍历 构建完全二叉树 并查集 前缀树 图遍历 Dijkstra算法 Floyd-Warshall ...

  9. csuoj 1116: Kingdoms

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 1116: Kingdoms Time Limit: 3 Sec  Memory Limit ...

  10. CodeForces Round 192 Div2

    This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...

随机推荐

  1. SVN培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)

    前言   为了方便新加入团队的员工熟悉团队协作开发.  为了将好东西整理分享给有需要的网友.  将SVN内部员工培训文档公开,以方便更多的人,提高知识获取速度,尽快熟悉协同开发.  本文档培训员工对于 ...

  2. 麒麟系统开发笔记(四):从Qt源码编译安装之编译安装QtCreator4.8.1,并配置编译测试Demo

    前言   本篇紧接上一篇,上一篇已经从Qt源码编译了Qt,那么Qt开发的IDE为QtCreator,本篇从源码编译安装QtCreator,并配置好构建套件,运行Demo并测试.   QtCreator ...

  3. [学习笔记]在Linux中使用源码编译的方式安装Nginx

    ​准备工作 准备nginx源码包: http://nginx.org/en/download.html 准备相关的依赖包以及环境: gzip 模块需要 zlib 库  http://www.zlib. ...

  4. 异步小工具 asyncTool

    class asyncTool { constructor () { this.arr = [] this.ctx = {} } use (func) { const into = { func, n ...

  5. vue-cli-service build 时间戳 方便查看bug发布时间和项目发布时间对比

    vue.config.js let ret = '' const date = new Date() ret += date.getFullYear() ret += '-'+ (date.getMo ...

  6. arch安装discover ——KDE商店

    yay  -S discover sudo pacman -S archlinux-appstream-data packagekit-qt5 flatpak fwupd 安装完就可以使用KDE商店了

  7. WEBRTC回声消除-AECM算法源码解析之参数解析

    一 概述   webrtc 针对回声问题一共开源了3种回声消除算法,分别为aec,aecm,以及aec3,其中aec是最早期的版本,在后续的更新中aec3的出现代替了aec在webrtc 中的地位,而 ...

  8. iot梳理

    近段时间一直在搞公司的iot项目,没啥时间学习新的知识(也是自己懒),这边记录下整体对iot知识领域的认识. 首先说到iot会想到物联网,对于我们开发来说物联网很明显要用到几个不太常用到的技术,如mq ...

  9. Feign调用远程服务时传递Cookie信息

    @Configuration public class TtpfFeignConfig { @Bean public RequestInterceptor requestInterceptor(){/ ...

  10. 从零搭建react+ts组件库(二)less模块化与svg引入配置

    在上一篇<从零搭建react+ts组件库(一)项目搭建与封装antd组件>介绍了使用webpack来搭建一个基于antd的组件库的基本框架,但是作为一个组件库,实际上还有很多的都还未引入, ...