bzoj 1150: [CTSC2007]数据备份Backup
Description

Input
Output
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
Sample Input
1
3
4
6
12
Sample Output
HINT
Source
首先选择的肯定是相连的两个建筑,我们可以黑白染色,然后变成二分图的费用流问题;
但是这样跑不过去,我们把问题转化一下,把距离数组差分之后,变为选取k个不相邻的点(如果相邻的话表示一个点被匹配了两次)
我们用堆模拟费用流的过程,我们取一个堆顶元素,则把答案先累加,然后把pre[x]+nxt[x]-v加入堆中,把pre[x]和nxt[x]删除,然后用双向链表维护pre[x]和nxt[x];
在首尾放Inf,可以减少特判;
这样做是什么道理呢?
堆中存的是相当于是增广路,我们相当于费用流先增广这一条路径,然后我们把反向边的流量+1,然后把带反向边的这一条新的一条增广路加入堆中,
这样最大匹配数也不会变,然后正确性就与费用流的反向边是一个道理,即撤销原操作;
这是一道双倍经验题,另一个题就是种树;
//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N=500050;
const int Inf=2147483647;
struct data{
int x,v;
};
bool operator < (data a,data b){
return a.v > b.v;
}
priority_queue<data> Q;
int pre[N],nxt[N],tt,d[N],n,k,v[N],bj[N];
int main(){
scanf("%d%d",&n,&k);int ans=0;
for(int i=1;i<=n;i++) scanf("%d",&d[i]);
for(int i=1;i<n;i++) v[i]=d[i+1]-d[i];
v[0]=Inf,v[n]=Inf;tt=n;
for(int i=1;i<n;i++) pre[i]=i-1,nxt[i]=i+1;
for(int i=1;i<n;i++) Q.push((data){i,v[i]});
for(int i=1;i<=k;i++){
while(!Q.empty()&&bj[Q.top().x]) Q.pop();
ans+=Q.top().v;tt++;
int x=Q.top().x,w=Q.top().v;Q.pop();
v[tt]=v[pre[x]]+v[nxt[x]]-w;Q.push((data){tt,v[tt]});
bj[x]=1;bj[pre[x]]=1;bj[nxt[x]]=1;
pre[tt]=pre[pre[x]];nxt[tt]=nxt[nxt[x]];
nxt[pre[tt]]=tt,pre[nxt[tt]]=tt;
}
printf("%d\n",ans);
return 0;
}
bzoj 1150: [CTSC2007]数据备份Backup的更多相关文章
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】
题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. ...
- BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
- 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
[BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...
随机推荐
- JavaScript实现动画效果
说到JavaScript实现动画效果,不得不想到两个函数,setTimeout和setInterval. setTimeout的常用的使用方法为 setTimeout(callback, delay) ...
- 自己动手编写IOC框架(四)
终于到了激动人心的时刻了,首先感谢小伙伴们的阅读,如果能多点评论,多点探讨就更好了,没有交流让我觉得我写的东西只有标题有点价值,内容只是在浪费大家的时间.为了泪滴下周能写下一个框架orm,请小伙伴们能 ...
- CCF-201503-2-数字排序
问题描述 试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序 ...
- Netty4.0.24.Final 版本中 IdleStateHandler 使用时的局限性
使用Netty在客户端和服务端建立通讯通道,一般来说,一个连接可能很久没有访问,由于各种各样的网络问题导致连接已经失效,客户端再次发送请求时会产生连接异常. 基于这个原因,需要在客户端和服务端之间建立 ...
- 深港澳大湾区第三次.NET技术交流会圆满成功
2017年12月10日,一场以云.devops.微服务.容器是现在这个发展阶段的软件形态, 本次活动我们围绕这些话题介绍.NET生态下的发展本地社区活动,这次活动还得到如鹏网杨中科老师的大力支持开通网 ...
- js事件底层原理探究
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 初学sheel脚本练习过程
以下是初学sheel脚本练习过程,涉及到内容的输出.基本的计算.条件判断(if.case).循环控制.数组的定义和使用.函数定义和使用 sheel脚本内容: #! /bin/bashecho &quo ...
- Django中多表查询思路
需求: 1.有一张文章表和一张评论表 2.两张表的关系是一对多 3.规则:若是有新评论,则将对应的文章置顶,若是有新文章则将新文章置顶. 思路: 在文章表中增加一个最后评论时间的字段.然后采用分组排序 ...
- Linux----CentOS-7搭建免流服务器
本次实验采用腾讯云服务器:https://cloud.tencent.com/ 大学生身份的可以看看有没有什么活动购买 其他身份的78一个月 关于腾讯云服务器的使用可以看看腾讯云的使用手册 本博客涉及 ...
- Swift开发教程--使用Storyboard进行界面跳转
使用storyboard结合代码来做确实能够给开发带来非常多的便利. 在实践的过程中,我们常常会遇到界面的跳转问题. 通过控件和界面的建立的"连接"就能够了. 假设是navigat ...