BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1的序列,要求选出k个不相邻的数使得和最小
费用流显然能跑。并且显然过不去- -
考虑用堆模拟费用流
一个错误的贪心是每次取最小。这样显然过不去例子
我们把【每次取最小】改为【每次选择一个区间取反】。用堆来维护这些区间就可以
每次取出最小的区间,然后将两边合并
(比方如今堆里有[1,3][4,4][5,5])这三个区间,我取走了[4,4]并计入答案。那么我删除[1,3]和[5,5]这两个区间,并增加[1,5]这个区间,权值为[1,3]的权值+[5,5]的权值-[4,4]的权值
因为是费用流所以不用考虑边界问题 直接把[0,0]和[n+1,n+1]设为INF就可以
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct abcd{
int x,val;
abcd() {}
abcd(int _,int __):
x(_),val(__) {}
bool operator < (const abcd &a) const
{
if( val != a.val )
return val > a.val ;
return x < a.x ;
}
bool operator == (const abcd &a) const
{
return x==a.x && val==a.val ;
}
};
namespace Heap{
priority_queue<abcd> heap,del_mark;
void Insert(abcd x)
{
heap.push(x);
}
void Delete(abcd x)
{
del_mark.push(x);
}
void Pop()
{
while( del_mark.size() && heap.top()==del_mark.top() )
heap.pop(),del_mark.pop();
heap.pop();
}
abcd Top()
{
while( del_mark.size() && heap.top()==del_mark.top() )
heap.pop(),del_mark.pop();
return heap.top();
}
}
int n,k,ans,a[M],val[M];
namespace Union_Find_Set{
int fa[M],rank[M],l[M],r[M];
int Find(int x)
{
if(!fa[x]||fa[x]==x)
return fa[x]=x;
return fa[x]=Find(fa[x]);
}
void Union(int x,int y)
{
int _l=l[x=Find(x)];
int _r=r[y=Find(y)];
if(rank[x]>rank[y])
swap(x,y);
if(rank[x]==rank[y])
++rank[y];
fa[x]=y;
l[y]=_l;r[y]=_r;
}
}
int main()
{
using namespace Union_Find_Set;
int i;
cin>>n>>k;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n+1;i++)
l[i]=i-1,r[i]=i+1;
Heap::Insert(abcd(1,val[1]=0x3f3f3f3f));
Heap::Insert(abcd(n+1,val[n+1]=0x3f3f3f3f));
for(i=2;i<=n;i++)
Heap::Insert(abcd(i,val[i]=a[i]-a[i-1]));
for(i=1;i<=k;i++)
{
abcd temp=Heap::Top();Heap::Pop();
ans+=temp.val;
int _l=Find(l[temp.x]),_r=Find(r[temp.x]);
Heap::Delete(abcd(_l,val[_l]));
Heap::Delete(abcd(_r,val[_r]));
temp.val=val[_l]+val[_r]-val[temp.x];
Union(_l,temp.x);
Union(temp.x,_r);
temp.x=Find(temp.x);
Heap::Insert(temp);
val[temp.x]=temp.val;
}
cout<<ans<<endl;
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
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...
- BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...
- 【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 链表+小根堆
BZOJ1150 [CTSC2007]数据备份Backup 题意: 给定一个长度为\(n\)的数组,要求选\(k\)个数且两两不相邻,问最小值是多少 题解: 做一个小根堆,把所有值放进去,当选择一个值 ...
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
随机推荐
- delphi 使用superobject实现jsonrpc的http远程调用 good
http://blog.csdn.net/earbao/article/details/46423167
- Spring3.0官网文档学习笔记(一)
Part 1 Spring框架概述 Spring是模块化的,在应用中仅仅须要引入你所须要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web ser ...
- Cocos2d-x 3.1.1 lua-tests 开篇
Cocos2d-x 3.1.1 lua-tests开篇 本篇博客打算从研究Cocos2d-x引擎提供的測试样例来写起,笔者针对Cocos2d-x 3.1.1这个版本号来介绍怎样来学习它给我们提供的 ...
- 搭建自己的XenServer+CloudStack云平台,提供IaaS服务(一)环境搭建
目标 搭建一个完整的基于XenServer和CloudStack的虚拟化平台,提供IaaS服务. 搭建三台安装了XenServer的服务器 搭建一台安装了CloudStack的服务器用以管理云平台 搭 ...
- WinCE隐藏显示任务栏,当任务栏隐藏时将其显示,当任务栏显示时将其隐藏(FindWindow,ShowWindow,IsWindowVisible),
HANDLE hWndTaskBar = ::FindWindow(TEXT("HHTaskBar"), NULL); if(::IsWindowVisible(hWndTask ...
- mysql登录报错 ERROR 1045 (28000)
1.现象: [root@localhost ~]# mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for us ...
- Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用
现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取.其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行 分析筛选的过程.比如,有的比较购物网站,会同时去抓取不同购物 ...
- Hlg 1832 【线段树 && RMQ】.cpp
题意: 在给出的区间内求出最大买进卖出的差价. 思路: 对于弱数据:维护一个从左到右的最大差价和最小值.即当发现当前值比最小值小的时候更新最小值,否则看一下当前值与之前最小值的差价是否比最大差价大,是 ...
- 单片机实验: 三轴磁场模块 GY-271
最近买了一块三轴磁场模块进行实验 名称:HMC5883L模块(三轴磁场模块) 型号:GY-271 使用芯片:HMC5883L 供电电源:3-5v 通信方式:IIC通信协议 测量范围:±1.3-8 高斯 ...
- Android的PackageManager的使用
Android系统提供了很多服务管理的类,包括ActivityManager.PowerManager(电源管理).AudioManager(音频管理)以及PackageManager管理类.Pack ...