【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
【BZOJ1150】[CTSC2007]数据备份Backup
Description

Input
Output
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
Sample Input
1
3
4
6
12
Sample Output
题解:如果你略懂费用流建模的话,相信这题你一定知道费用流的建法,本题的费用流模型大概长这样:
为了限流,将源点拆成两个。再将每个办公楼拆成两个,中间边的费用就是二者的距离。

垃圾画图软件。。。这里就自行脑补一下,每一层的顺序都是p1,p2,p3,p4吧。。。
假如k=2,并且b<a<c,那么我们跑费用流的时候就会先走两条费用为b的边,然后图中又会出现两条费用为-b的反向边。然后我们继续流,此时我们发现可以走两条费用为a+c-b的边,然后跑完了,总费用2a+2c。
然后我们想办法模拟这个过程,先求出所有相邻的办公楼之间的距离,每次用优先队列选出长度最小的那个间隔,然后将那个间隔的前一个和后一个间隔删掉,将当前间隔的长度改为(前一个的长度+后一个的长度-这个的长度)。删除的操作可以用双向链表实现。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
using namespace std;
const int maxn=100010;
const int inf=500000000;
struct node
{
int pre,next,val,del;
}p[100010];
typedef pair<int,int> pii;
priority_queue<pii> pq;
int n,m,ans;
int v[maxn];
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,a;
for(i=1;i<=n;i++) v[i]=rd();
for(i=1;i<n;i++)
{
p[i].val=v[i+1]-v[i];
p[i].pre=i-1,p[i].next=(i+1==n)?0:i+1;
pq.push(mp(-p[i].val,i));
}
p[0].val=inf;
pii x;
for(i=1;i<=m;i++)
{
do
{
x=pq.top(),pq.pop();
}while(p[x.second].del);
ans+=-x.first,a=x.second,p[a].val=p[p[a].pre].val+p[p[a].next].val-p[a].val;
if(p[a].pre)
{
p[p[a].pre].del=1,p[a].pre=p[p[a].pre].pre;
if(p[a].pre) p[p[a].pre].next=a;
}
if(p[a].next)
{
p[p[a].next].del=1,p[a].next=p[p[a].next].next;
if(p[a].next) p[p[a].next].pre=a;
}
pq.push(mp(-p[a].val,a));
}
printf("%d",ans);
return 0;
}
【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)的更多相关文章
- 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 贪心 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1150 题意概括 数轴上面有一堆数字. 取出两个数字的代价是他们的距离. 现在要取出k对数,(一个数 ...
- BZOJ1150 [CTSC2007]数据备份Backup 链表+小根堆
BZOJ1150 [CTSC2007]数据备份Backup 题意: 给定一个长度为\(n\)的数组,要求选\(k\)个数且两两不相邻,问最小值是多少 题解: 做一个小根堆,把所有值放进去,当选择一个值 ...
- BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- bzoj1150: [CTSC2007]数据备份Backup
题目大意: 在n个点中,选出k对相邻的互不相同的点,使k段距离的总和最小. 贪心,双向链表. 首先,点之间的距离是动态的,所以要用堆来维护. 每次都选择最近的点.但因为其他情况,可能最终不会选择这 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
随机推荐
- DB2时间函数 实现 时间加减
时间加减:后边记得跟上时间类型如day.HOUR TIMESTAMP ( TIMESTAMP(DEF_TIME)+1 day)+18 HOUR DB2时间函数是我们最常见的函数之一,下面就为您介绍 ...
- AC日记——郁闷的出纳员 codevs 1286
郁闷的出纳员 思路: 设工资下限为ko,然后ko--(因为要小于工资下限): 设cur为记录工资增长,降低: 设第i个人的工资为pos: 对应的四种操作: 插入:cur-pos-ko: 增长:cur- ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- Java 大数(整数+浮点数) 基本函数
import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; public class Main { pu ...
- HDU 4343 Interval query(贪心 + 倍增)
题目链接 2012多校5 Problem D 题意 给定$n$个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点. 然后有$m$个询问,每个询问也为一个区间,数字范围在$[ ...
- Vscode 小白使用介绍
前言 现在使用Vscode编码的人越来越多,凭借着免费,开源,轻量,跨平台的特点收货了一大批忠实粉丝 最近因项目需要开始使用Vscode,但不知为何,感觉有点力不从心,不知道该怎么用 首先想到去官 ...
- Qt小结
(1)#include 报错fatal error: QHostInfo:No such file or directory, 解决办法 在.pro文件中添加 QT += core gui netwo ...
- java项目热加载工具jrebel
flask有热加载的功能,修为代码后,自动生效. java项目也有类似的功能,不过需要使用收费的插件jrebel 提供一个免费的注册服务器:http://139.199.89.239:1008/884 ...
- ArcGIS教程:面积制表
摘要 计算两个数据集之间交叉制表的区域并输出表. 插图 使用方法 · 区域定义为输入中具有同样值的全部区.各区无需相连. 栅格和要素数据集都可用于区域输入. · 假设区域输入和类输入均为具有同样分辨率 ...
- 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
转:http://blog.csdn.net/linxingliang/article/details/52069503 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求 ...