【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1136 Solved: 458
[Submit][Status][Discuss]
Description


Input
输入的第一行包含整数n和k,其中n(2 ≤ n ≤100 000)表示办公楼的数目,k(1≤ k≤ n/2)表示可利用的网络电缆的数目。接下来的n行每行仅包含一个整数(0≤ s ≤1000 000 000), 表示每个办公楼到大街起点处的距离。这些整数将按照从小到大的顺序依次出现。
Output
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
Sample Input
1
3
4
6
12
Sample Output
HINT
上面的样例输入给出了前面描述的示例情形 对于每一个测试点,如果写到输出文件中的答案正确,则得到该测试点100%的分数,否则得零分。30%的输入数据满足n≤20。60%的输入数据满足n≤10 000。
一开始觉得要贪心什么的
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue> #define maxn 1000001 using namespace std; int a[maxn*],n,k,pre[maxn*],next[maxn*],num=; long long cha[maxn*],ans=; bool vis[maxn*]; struct node{
int x;
long long c;
bool operator <(const node &A)const{
if(A.c==c)return x>A.x;
return c>A.c;
}
}; priority_queue<node>q; inline int in()
{
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
} void Pre()
{
for(int i=;i<n;i++)
cha[i]=a[i+]-a[i],q.push((node){i,a[i+]-a[i]}),pre[i]=i-,next[i]=i+;
num=n;
pre[n]=n-;next[]=;
} void solve()
{
node Top;
for(int i=;i<=k;i++)
{
Top=q.top();q.pop();
while(vis[Top.x])
Top=q.top(),q.pop();
if(pre[Top.x]==)
{
pre[next[next[Top.x]]]=;
ans+=Top.c;
vis[Top.x]=vis[next[Top.x]]=;
}
else if(next[Top.x]==n)
{
next[pre[pre[Top.x]]]=n;
ans+=Top.c;
vis[Top.x]=vis[pre[Top.x]]=;
}
else
{
ans+=Top.c;
node New;
New.x=++num;
New.c=cha[pre[Top.x]]+cha[next[Top.x]]-Top.c;
pre[New.x]=pre[pre[Top.x]],next[pre[New.x]]=New.x;
next[New.x]=next[next[Top.x]],pre[next[New.x]]=New.x;
vis[Top.x]=vis[next[Top.x]]=vis[pre[Top.x]]=;
cha[num]=New.c;
q.push(New);
}
}
} int main()
{
n=in();k=in();
for(int i=;i<=n;i++)a[i]=in();
Pre();solve();
printf("%lld",ans);
return ;
}
【链表】bzoj 1150: [CTSC2007]数据备份Backup的更多相关文章
- [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 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- 【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 ...
随机推荐
- 自动恢复被挂掉的hbase region server
最近老遇到hbase的regionserver自动挂掉的情况 日志总是看不出什么原因 不得已弄了个定时任务,任务的脚本类似是: pssh -H "bluejoe1 bluejoe2...&q ...
- Entity Framework 6.1-Code First
原文:Entity Framework 6.1-Code First Code First-代码优先,先创建好领域模型.新建MyDbContext继承DbContext.根据代码自动生成数据库 Cod ...
- js 验证电话号 座机及手机号
function CheckTel() { /*验证电话号码 验证规则:区号+号码,区号以0开头,3位或4位号码由7位或8位数字组成 区号与号码之间可以无连接符,也可以“-”连接 如010888888 ...
- javascript笔记—— 构造函数
出处:http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html 数据类型 ...
- css 笔记——设置禁用中文输入法
ime-mode ime-mode的语法解释如下: ime-mode : auto | active | inactive | disabled 取值: auto : 默认值.不影响IME的状态.与 ...
- java匿名内部类练习
interface Inter { void method(); } class Test { //补足代码.通过匿名内部类. /* static class Inner implements Int ...
- js中的一些零碎方法
ajax表单提交: $.post("do_login", f.serializeArray(), function(data) { if (data.status + " ...
- java学习笔记_GUI(3)
如何加入自己定义的Panel import javax.swing.*; import java.awt.event.*; import java.awt.*; 5 class MyPanel ext ...
- 如何在Android SDK 下查看应用程序输出日志的方法
该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...
- linux 硬盘相关命令学习
summary: 查看硬盘信息:几块硬盘,品牌,容量 查看分区信息 参考资料: Linux下查看磁盘分区命令详解: http://blog.chinaunix.net/uid-26119273-id- ...