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. HTTP - 条件请求

    当 HTTP 请求包含 If-XXX 这种样式的首部时,服务器会对附带的条件进行判断,只有判断指定条件为真,才会执行请求.这样的请求首部有五个,分别是 If-Modified-Since.If-Unm ...

  2. MySql索引的优缺点

    优点 有了索引.对于记录数量很多的表,可以提高查询速度. 缺点 索引是占用空间的. 索引会影响update insert delete速度 ALERT!!! 1.索引要创建在where和join用到的 ...

  3. SparkSQL之数据源

    准备json文件: cat /root/1.json {"name":"Michael"} {"name":"Andy" ...

  4. Apache配置多端口多站点

    配置httpd.conf 监听多个端口 复制代码 代码如下:# Listen: Allows you to bind Apache to specific IP addresses and/or # ...

  5. ios Swift 特性

    特性提供了关于声明和类型的更多信息.在Swift中有两类特性,用于修饰声明的以及用于修饰类型的.例如,required特性,当应用于一个类的指定或便利初始化器声明时,表明它的每个子类都必须实现那个初始 ...

  6. javascript函数没有重载测试

    今天继续学习javascript系列教程,虽然是基础,但我觉得还是有必要用心来学习的,不要怕难,不用怕忘记,不要怕学不会.哪个高手不是从零开始的,我要坚定自己的学习信心,并且认真的走下去.虽然路途艰辛 ...

  7. 我的博客已搬迁到http://www.lsworks.net

    我的博客已搬迁到http://www.lsworks.net

  8. 使用AngularJS构建大型Web应用

    AngularJS是由Google创建的一种JS框架,使用它可以扩展应用程序中的HTML词汇,从而在web应用程序中使用HTML声明动态内容.在该团队工作的软件工程师Brian Ford近日撰写了一篇 ...

  9. 添加线标注ILineElement

    private void AddLineElement(IPolyline polyline) { try { IPolyline pPolyline = polyline; IRgbColor pL ...

  10. 取消定时-CICS

    CICE CA R 做定时的时候最好加上REqID