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

5 2
1
3
4
6
12

Sample Output

4

HINT

上面的样例输入给出了前面描述的示例情形 对于每一个测试点,如果写到输出文件中的答案正确,则得到该测试点100%的分数,否则得零分。30%的输入数据满足n≤20。60%的输入数据满足n≤10 000。


  一开始觉得要贪心什么的
  瞄了一眼题解
  貌似我再想一下能出来( 大雾
  然后感觉好困。。
  最后几乎是半抄完了
  易得每次只能选相邻点
  所有只有n-1条边可选
  每次链表选最小的
  然后选完后合并前一个和后一个
  具体来说就是堆维护最小值
  每次合并-->该边和上一条和下一条不可选,创建一个新的节点代替原来的三个,ans加上权值
  权值是左边+右边-中间(再选新节点=不选中间选两边)
  还有就是选队首队尾,则易得选队首的后一个和选队尾的前一个不可能优。
 #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的更多相关文章

  1. [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】

    题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. ...

  2. bzoj 1150: [CTSC2007]数据备份Backup

    Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...

  3. bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】

    参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...

  4. BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...

  5. BZOJ 1150 CTSC2007 数据备份Backup 堆+馋

    标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...

  6. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  7. 1150: [CTSC2007]数据备份Backup

    1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...

  8. BZOJ1150 [CTSC2007]数据备份Backup 链表+小根堆

    BZOJ1150 [CTSC2007]数据备份Backup 题意: 给定一个长度为\(n\)的数组,要求选\(k\)个数且两两不相邻,问最小值是多少 题解: 做一个小根堆,把所有值放进去,当选择一个值 ...

  9. bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆

    [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2727  Solved: 1099[Submit][Stat ...

随机推荐

  1. Lombok(1.14.8) - @Synchronized

    @Synchronized @Synchronized,实现同步. package com.huey.lombok; import java.util.Date; import lombok.Sync ...

  2. Nginx - HTTP Configuration, Module Directives

    Socket and Host Configuration This set of directives will allow you to configure your virtual hosts. ...

  3. WP8.1 RSA 加解密实例(导入公钥私钥)

    因项目上需要用到,之前在WP8.0的环境上调试通过,现在在开发8.1时发现已不支持原来的加密库,所以无法使用以前的方法,不得已,去寻找windows命名空间下RSA的加解密方法,经过几天的尝试,将解决 ...

  4. 每天一道LeetCode--326. Power of Three

    Given an integer, write a function to determine if it is a power of three. Follow up:Could you do it ...

  5. 关于微信response_type参数错误

    可能出现问题的几个原因: 1.正确的2.0auth的地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=1%&redire ...

  6. (Android)View.getHeight或getWidth为0时的一些解决方案

    在Android开发过程中,经常需要动态的更改View的大小,有些View的大小可能需要根据其他View的大小来设定,或者你需要得到一些View的大小来进行某项操作,但是有可能你需要在onCreate ...

  7. 第三十八篇、给UITabBar按钮的动画效果

    在很多情况下,我们也时常有这样的需求,就是在UITabBar切换的时候,添加一些动画效果 1.在UITabBar触发点击方法的时候捕获当前点击的item 2.使用coreAnimation设置动画效果 ...

  8. windows下配置Apache2.4一些改变

    下载地址: http://www.apachelounge.com/download/http://www.apachehaus.com/cgi-bin/download.plx Apache更新到2 ...

  9. 【转】VS2012发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...

  10. A version is required for an API group definition.

    A version is required for an API group definition.