BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
Description

非常神的一道题.
据说是模拟费用流(你也可以说是贪心加堆)
考虑最朴素的贪心:将所有元素都塞进一个堆里,那完一个就给旁边的打上标记,以此反复迭代.
不过,不难证明这种方法是完全错误的.
原因很简单:这个方法不能反悔,即每一个决策都是永久性的。
我们希望由可以反悔的机会。
首先,我们可以得到一个结论:
假若 $arr[i]$ 为当前数列中最小值,那么,如果不选 $arr[i]$,则一定要选择 $arr[i-1]$ 与 $arr[i+1]$。
于是,在加入 $arr[i]$,将其累积到答案中,并标记 $arr[i-1]$ 与 $arr[i+1]$ 不能选后,我们再将 $i$ 覆盖为 $arr[i-1]+arr[i+1]-arr[i]$。
为什么这样处理呢?
$arr[i]+arr[i-1]+arr[i+1]-arr[i]$ = $arr[i+1]+arr[i-1]$。以此达到了一个不断决策并反悔的过程。
以后可以专门学习一下模拟费用流,应该会对该问题有一个更加深刻的认识。
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define inf 100000000000
using namespace std;
struct Node{
long long key;
int id;
Node(long long a=0,int b=0):key(a),id(b){}
bool operator < ( Node c) const{
return key > c.key;
}
};
priority_queue<Node>Q;
int tag[maxn],suf[maxn],pre[maxn];
long long h[maxn],arr[maxn];
int main(){
// setIO("input");
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i) scanf("%lld",&arr[i]);
for(int i=1;i<=n;++i) { h[i]=(long long) arr[i]-arr[i-1], suf[i]=i+1,pre[i]=i-1; }
h[0]=inf, suf[n]=pre[2]=0;
for(int i=2;i<=n;++i) Q.push(Node(h[i],i));
long long ans = 0;
for(int i=1;i<=k;++i) {
while(tag[Q.top().id]) Q.pop();
Node u = Q.top();
ans += (long long) u.key;
int cur = u.id;
int l = pre[cur],r = suf[cur];
h[cur] = h[l]+h[r]-h[cur];
tag[l]=tag[r]=1;
h[l]=h[r]=inf;
pre[cur]=pre[l],suf[pre[cur]] = cur;
suf[cur]=suf[r],pre[suf[r]] = cur;
Q.pop();
Q.push(Node(h[cur],cur));
}
printf("%lld",ans);
return 0;
}
BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题的更多相关文章
- BZOJ1150 [CTSC2007]数据备份Backup 链表+小根堆
BZOJ1150 [CTSC2007]数据备份Backup 题意: 给定一个长度为\(n\)的数组,要求选\(k\)个数且两两不相邻,问最小值是多少 题解: 做一个小根堆,把所有值放进去,当选择一个值 ...
- BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1150 题意概括 数轴上面有一堆数字. 取出两个数字的代价是他们的距离. 现在要取出k对数,(一个数 ...
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
- BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】
题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- bzoj1150: [CTSC2007]数据备份Backup
题目大意: 在n个点中,选出k对相邻的互不相同的点,使k段距离的总和最小. 贪心,双向链表. 首先,点之间的距离是动态的,所以要用堆来维护. 每次都选择最近的点.但因为其他情况,可能最终不会选择这 ...
- bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...
- 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
[BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
随机推荐
- Future和Callable的使用
应用场景 财务成本核算.可能会有多个耗时的步骤.如果顺序执行是非常慢的.再相互数据获取数据不依赖的情况下可以使用Future并行执行 public class FutureTest implement ...
- APIO 2017 游记
//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意, ...
- hdu 1245 Saving James Bond 策画几何+最短路 最短路求步数最少的路径
#include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #defi ...
- [bzoj1316]树上的询问_点分治
树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...
- C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素
转自原文 C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素 有时候,我们要对图层上的地物进行有选择性的显示,以此来满足实际的功能要求. 按下面介绍的方法可轻松实现图层属性 ...
- plsql developer ini
plsql developer ini [Colors] GradientEnabled=True VerticalGradient=True DefaultGradient=True Gradien ...
- C语言遍历文件和文件夹——————【Badboy】
[cpp] #include #include #include #include #include #include #include #define MAX_PATH_LENGTH 512 #de ...
- 关系型数据库与HBase的数据储存方式差别
现在Bigtable型(列族)数据库应用越来越广,功能也非常强大. 可是非常多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表.存储.查询. 本文以hbase举例讲述数据模式的变化. 传 ...
- 关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下(5.2为例): struct _zval_struct { ...
- PHP设计模式之 单例模式 工厂模式 实例讲解
单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的.所有的单例模式至少拥有以下三种公共元素:1. 它们必须拥有一个构造函数,并且必须被标记为priva ...