\(\mathcal{Description}\)

  Link.

  给定升序序列 \(\{x_n\}\) 以及整数 \(k\),在 \(\{x_n\}\) 中选出恰 \(k\) 对 \((x_i,x_j)\),使得不存在某个值出现次数多于一次,并最小化 \(\sum|x_i-x_j|\)。

\(\mathcal{Solution}\)

  告诉我,你有一个错误的贪心 owo!

  显然 \((x_i,x_j)\) 是相邻的两个数。令 \(a_i=x_{i+1}-x_i\),问题转化为选 \(k\) 个 \(a_i\) 使其和最小,并保证 \(a_i\) 被选后 \(a_{i-1}\) 和 \(a_{i+1}\) 不被选。

  贪心取最小是不可取的,样例就是反例。不过可以使用网络流退流的思想挽救这个贪心。每次取出最小值 \(a_i\) 时,将 \(a_i\) 的值置为 \(a_{i-1}+a_{i+1}-a_i\) 并重新入堆,同时删除在序列上 \(a_{i-1}\) 和 \(a_{i+1}\)(这里的下标加减法指前驱后继,因为有些数已经被删掉了)。考虑再次选择 \(a_i\) 时所表达的方案:

  初始:

\[\require{cancel}a_{i-2}~~~~a_{i-1}~~~~a_i~~~~a_{i+1}~~~~a_{i+2}
\]

  选 \(a_i\),此时答案 \(ans=a_i\);并重置 \(a_i\),删前驱后继:

\[\require{cancel}a_{i-2}~~~~\cancel{a_{i-1}}~~~~a_{i-1}+a_{i+1}-a_i~~~~\cancel{a_{i+1}}~~~~a_{i+2}
\]

  再选 \(a_i\),此时答案 \(ans=a_i+a_{i-1}+a_{i+1}-a_i=a_{i-1}+a_{i+1}\),再重置,删除:

\[\require{cancel}\cancel{a_{i-2}}~~~~\cancel{a_{i-1}}~~~~a_{i-2}+a_{i+2}-a_{i-1}-a_{i+1}+a_i~~~~\cancel{a_{i+1}}~~~~\cancel{a_{i+2}}
\]

  可以发现,这与直接选 \(a_{i-2}\) 和 \(a_{i+2}\) 是等效的!所以维护一个双向链表,利用堆进行贪心即可。

  复杂度 \(\mathcal O(n\log n)\)。

\(\mathcal{Code}\)

#include <queue>
#include <cstdio> typedef long long LL;
typedef std::pair<LL, int> pli; const int MAXN = 1e5;
int n, K, pre[MAXN + 5], suf[MAXN + 5];
LL val[MAXN + 5];
bool rmd[MAXN + 5];
std::priority_queue<pli, std::vector<pli>, std::greater<pli> > heap; inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
} inline void rmpos ( const int u ) {
if ( ! u || u == n ) return ;
rmd[u] = true;
if ( pre[u] ) suf[pre[u]] = suf[u];
if ( suf[u] ^ n ) pre[suf[u]] = pre[u];
pre[u] = suf[u] = 0;
} int main () {
n = rint (), K = rint ();
for ( int i = 0, p, las; i < n; ++ i ) {
p = rint ();
if ( i ) {
heap.push ( { val[i] = p - las, i } );
pre[i] = i - 1, suf[i] = i + 1;
}
las = p;
}
LL ans = 0;
val[0] = val[n] = 1ll << 60;
while ( K -- ) {
pli t = heap.top (); heap.pop ();
if ( rmd[t.second] ) { ++ K; continue; }
ans += t.first; LL nv = -t.first;
nv += val[pre[t.second]], rmpos ( pre[t.second] );
nv += val[suf[t.second]], rmpos ( suf[t.second] );
heap.push ( { val[t.second] = nv, t.second } );
}
printf ( "%lld\n", ans );
return 0;
}

Solution -「APIO/CTSC 2007」「洛谷 P3620」数据备份的更多相关文章

  1. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  2. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  3. 洛谷 P3620 [APIO/CTSC 2007]数据备份 解题报告

    P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...

  4. P3620 [APIO/CTSC 2007]数据备份

    P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...

  5. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  6. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  7. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  8. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  9. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

随机推荐

  1. win10 安装vb -打开后一直显示无响应-解决

    1.成功安装vb ,美滋滋的运行 ,但是一直卡在无响应状态, 2.解决 使用管理员权限打开即可,也可以更改兼容为win7/8, 神奇的是,我这电脑自用过一次管理员权限打开,后面再使用vb可以不用管理员 ...

  2. ch01系统基础信息模块详解

    第1章 系统基础信息模块详解 1.1 系统性能信息模块 psutil 解决VMWare在Windows10的安装问题: 安装VC Redistributable 2017 解决虚拟机的上网问题:修改V ...

  3. react中实现css动画

  4. Visual Studio 设置背景图片主题(所有版本设置方法)

    前言 效果预览: 目录 扩展安装 图片背景设置 主题透明并扩展到 IDE 内容 扩展安装 ClaudiaIDE 扩展下载 我们打开VS的扩展安装界面:[扩展]->[管理扩展]->[联机], ...

  5. springboot启动过程中常用的回调

    1.介绍 springboot提供非常丰富回调接口,利用这些接口可以做非常多的事情,对于一些常用的回调接口进行介绍 2.常用的拓展接口 1.ApplicationContextInitializer ...

  6. 干掉 Postman?测试接口直接生成API文档,ApiPost真香!

    实不相瞒我的收藏夹里躺着很多优质的开发工具,我有个爱好平时遇到感兴趣的开发工具都会记录下来,然后有时间在慢慢研究.前几天刚给同事分享一款非常好用的API文档工具,真的被惊艳到了,粉丝朋友们也感受一下吧 ...

  7. 【get√】golang新手理解了一点点context

    测试代码如下: package practice import ( "context" "log" //"fmt" "time&q ...

  8. [一]Cesium利其器——Visual Studio Code

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ IDE Web前端刚入门的朋友,常常想选择一个快速.好用.流行( ...

  9. 实习之bii--关于虚拟机桥接无线网卡

    安装完VMware workstation之后,网络连接里会多出两个虚拟网卡: VMware Network Adapter VMnet1和VMware Network Adapter VMnet8. ...

  10. 集合框架-Map集合-TreeMap存储自定义对象

    1 package cn.itcast.p8.treemap.demo; 2 3 4 import java.util.Iterator; 5 import java.util.Map; 6 impo ...