Luogu 3620 数据备份 - Set
Solution
很显然, 最优情况肯定是相邻两个相连 。
然后模型就跟 Luogu1484 类似了。
把两个房子 看成一个坑 (参考 Luogu1484), 选取 $k$ 个不相邻的坑, 使得权值最小。
Luogu1484 则是 选取 至多 $k$ 个不相邻坑, 使得权值最大。
先考虑简单问题:
当$k= 1$时, 肯定是选择 最大 的$a[i]$
当$k= 2$时, 仅有两种情况 选 最大的 $a[i]$ 和 不相邻的 $a[j]$ 或者 $a[i+1]+a[i-1]$
我们先选了最大的$a[i]$
那么怎么样才能让下一个找到的最大的 $a[j]$ 是满足条件的解呢?
我们把 $a[i - 1]$ 和 $a[i + 1]$ 删去, 然后把 $a[i]$改为 $a[i + 1] + a[i - 1] - a[i]$,这样就满足了肯定不会 单独选到 $a[i + 1]或a[i-1]$。
并且我们若想要选$a[i+1]和a[i-1]$且不选$a[i]$ 只需要再选一次$a[i]$即可。
在$k$更大的情况下同样适用。
然后就用链表存储 $nxt$ 与 $pre$, $Set$ 维护 最大值/ 最小值。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define rd read()
#define ll long long
using namespace std;
typedef pair<ll, int> P; const int N = 1e5 + ;
const ll inf = 1e10; int n, k;
int nxt[N], pre[N];
ll a[N], ans;
set<P> st; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} void del(int x) {
nxt[pre[x]] = nxt[x];
pre[nxt[x]] = pre[x];
} int main()
{
n = rd; k = rd;
for (int i = ; i <= n; ++i)
a[i] = rd;
n--;
for (int i = ; i <= n; ++i)
a[i] = a[i + ] - a[i];
for (int i = ; i <= n; ++i)
nxt[i] = i + , pre[i] = i - ;
for (int i = ; i <= n; ++i)
st.insert(P(a[i], i));
a[] = a[n + ] = inf;
set<P> :: iterator it;
for (; k; --k) {
it = st.begin();
P tp = *it;
int x = tp.second; ll y = a[x];
ll t = a[pre[x]] + a[nxt[x]] - y;
a[x] = t; ans += y;
st.insert(P(t, x));
st.erase(P(y, x));
if (pre[x])
st.erase(P(a[pre[x]], pre[x])), del(pre[x]);
if (nxt[x] && nxt[x] != n + )
st.erase(P(a[nxt[x]], nxt[x])), del(nxt[x]);
}
printf("%lld\n", ans);
}
Luogu 3620 数据备份 - Set的更多相关文章
- 数据备份的OSS接口
最近在做一个新的项目,从RDS备份到OSS,进行数据备份以及后续的还原.这边对阿里云的OSS数据上传接口进行说明,先做下笔记先简单介绍下OSS: ①Object 在OSS中,用户操作的基本数据单元是O ...
- 两种适用于中小量数据的mysql数据备份
近来项目的业务量开始大了,感觉如果数据不周期性地备份一下,很可能会出现问题,虽然我每天都有阿里云的自动快照,上网找了一下方法,找到两种相对简单而又适合中小项目或者中小公司的数据备份策略,以下都是数据库 ...
- redis主从复制 从而 数据备份和读写分离
蜗牛Redis系列文章目录http://www.cnblogs.com/tdws/tag/NoSql/ 爬虫转载注明地址本文地址—博客园蜗牛 http://www.cnblogs.com/tdws/p ...
- MySQL 数据备份与还原
一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先 ...
- 转 MySQL 数据备份与还原
MySQL 数据备份与还原 原贴:http://www.cnblogs.com/kissdodog/p/4174421.html 一.数据备份 1.使用mysqldump命令备份 mysqldum ...
- Linux文件系统应用---系统数据备份和迁移(用户角度)
1 前言 首先承诺:对于从Windows系统迁移过来的用户,困扰大家的 “Linux系统下是否可以把系统文件和用户文件分开到C盘和D盘中” 的问题也可以得到完满解决. 之前的文章对Linux的文 ...
- 开源服务专题之-------rsync数据备份
RSYNC是Remote Sync 远程同步的简称,与SCP的比较,SCP= 无法备份大量数据,类似windows的复制,而rsync=边复制 ,边统计,边比较,可以备份大量数据.可以镜像保存整个目录 ...
- Oracle数据备份bat
@echo on setlocal rem 设置数据库和备份文件参数... set sid=testorcl set username=testname set password=testpwd se ...
- Bzoj1150 数据备份Backup
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
随机推荐
- 微信小程序 在canvas画布上划动,页面禁止滑动
要实现微信小程序 在canvas画布上划动,页面禁止滑动,不仅要设置disable-scroll="true",还要要给canvas绑定一个触摸事件才能生效. <canvas ...
- base64 压缩图片
//图片处理 afterimg(err, photos) { var _this = this; if(err && err != null && err != '') ...
- java 基础-思维导图
思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具.了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板. 思维 ...
- support:design:26.1.0
https://blog.csdn.net/qzltqdf3179103/article/details/79583491 compileSdkVersion 26buildToolsVersion ...
- redis 配置参数
redis配置参数说明: 属性 说明 daemonize 如果值是“yes”,则启动服务的时候是后台守护进程形式,如果值是“no”,则相反 pidfile 指定存储Redis进程号的文件路径 port ...
- 从源码安装Node
[从源码安装Node] Nodejs官网未并提供i686架构的bin,为了在i686架构cpu下使用Nodejs,需要从源码编译. 1../configure 2.make 3.make instal ...
- javascript中所有函数的参数都是按值传递的
[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm
- black-hole《XSS的原理分析与解剖》阅读笔记
0×01 前言: <xss攻击手法>一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的<白帽子讲WEB安全>和cn4rry的<XSS跨站脚本攻击剖析 ...
- Pandas操作数据库及保存csv
数据的保存 import pandas as pd import numpy as np from pandas import Series col_db = [['one',1,2,3,4,np.n ...
- jsp页面之初体验
最近在学jsp 在web.xml页面中学到了如何让一个页面第一个启动