题目大意: 在n个点中,选出k对相邻的互不相同的点,使k段距离的总和最小。

贪心,双向链表。

首先,点之间的距离是动态的,所以要用堆来维护。

 

每次都选择最近的点。但因为其他情况,可能最终不会选择这对点连在一起

所以把俩个点旁边的路径的和减去俩个点之间距离再加进去,表示连旁边的俩条边,不连现在的边。

要维护许多信息。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 400000 + 10;
const int INF = 0x3f3f3f3f;
struct heap {
int v,i;
} h[maxn];
int p[maxn],pre[maxn],next[maxn],pos[maxn];
int n,m,ans=0,size=0; void pushup(int x) {
while(h[x].v<h[x>>1].v) {
pos[h[x>>1].i]=x;
swap(h[x],h[x>>1]);
x>>=1;
}
pos[h[x].i]=x;
} void push(int v,int i) {
h[++size].v=v;
h[size].i=i;
pos[i]=size;
pushup(size);
} void pushdown(int x) {
int to;
while(x <= size/2) {
to=x<<1;
if(to<size && h[to].v>h[to+1].v) to++;
if(h[x].v > h[to].v) {
pos[h[to].i]=x;
swap(h[x],h[to]);
x=to;
}
else break;
}
pos[h[x].i]=x;
} void del(int x) {
h[x].v = INF;
pushdown(x);
} void init() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
for(int i=2;i<=n;i++) {
push(p[i]-p[i-1],i);
pre[i]=i-1; next[i]=i+1;
}
pre[2]=next[n]=0;
} void solve() {
int a,b;
heap k;
while(m--) {
k=h[1];
if(pre[k.i]==-1) {
ans+=k.v;
del(1); del(pos[next[k.i]]);
pre[next[next[k.i]]]=-1;
}
else if(next[k.i]==-1) {
ans+=k.v;
del(1); del(pos[pre[k.i]]);
next[pre[pre[k.i]]]=-1;
}
else {
ans+=k.v;
a=next[k.i]; b=pre[k.i];
pre[k.i]=pre[b]; next[pre[k.i]]=k.i;
next[k.i]=next[a]; pre[next[k.i]]=k.i;
h[1].v=h[pos[a]].v+h[pos[b]].v-h[1].v;
del(pos[a]); del(pos[b]);
pushdown(1);
}
}
printf("%d\n",ans);
} int main() {
init();
solve();
return 0;
}

bzoj1150: [CTSC2007]数据备份Backup的更多相关文章

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

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

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

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

  3. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

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

  4. BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】

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

  5. BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题

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

  6. BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1150 题意概括 数轴上面有一堆数字. 取出两个数字的代价是他们的距离. 现在要取出k对数,(一个数 ...

  7. 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)

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

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

    1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1136  Solved: 458[Submit] ...

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

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

随机推荐

  1. js替换字符串的所有示例代码

    js如何替换字符串中所有. /** * 替换字符串中所有 * @param obj 原字符串 * @param str1 替换规则 * @param str2 替换成什么 * @return 替换后的 ...

  2. AJAX 原理(转摘)

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...

  3. Linux下vsftp服务器—上传、下载

    一.  FTP 说明 Linux下常用的FTP Server是vsftp(Very Security File Transfer Protocol),及profpt(Professtional ftp ...

  4. 浅析 public static void main(String[] args)

    最初接触Java程序的时候,老师就教导我们要从下面这句开始学起,据说是约定俗成的,所以直到今天,还是只知道java程序应该这么写,具体为什么这么写,鄙人惭愧. public class ClassNa ...

  5. 关于FileSystemWatcher监听文件创建

    FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...

  6. XSS前端防火墙

    前一段时间,在EtherDream大神的博客里看到关于XSS防火墙的一系列文章,觉得很有意思.刚好科创要做一个防火墙,就把XSS前端防火墙作为一个创新点,着手去实现了. 在实现过程中,由于各种原因,比 ...

  7. 微软职位内部推荐-Principal Architect for Windows Security

    微软近期Open的职位: Location: China, BeijingDivision: Operations System Group Engineering Group OverviewOSG ...

  8. ios app - 打开系统设置URL

    ios --- 调用系统"设置"里的功能(转) 安装后第一次运行软件时,系统会弹出提示用户是否允许软件获取当前位置,如果用户不允许的话,之后运行时系统不会在弹出提示设置,这点很不方 ...

  9. 6779. Can you answer these queries VII - SPOJ

    Given a tree with N ( N<=100000 ) nodes. Each node has a interger value x_i ( |x_i|<=10000 ). ...

  10. WPF 视图分组排序

    视图分组排序 效果: 实现步骤: 第一步:为分组做一个标题头,就是效果图中的浅蓝色部分: <DataGrid.GroupStyle>标签部分: <DataGrid x:Name=&q ...