bzoj1150: [CTSC2007]数据备份Backup
题目大意: 在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的更多相关文章
- 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 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】
题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...
- BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1150 题意概括 数轴上面有一堆数字. 取出两个数字的代价是他们的距离. 现在要取出k对数,(一个数 ...
- 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
[BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...
随机推荐
- 使用jQuery的9个误区
千万别忘记了使用最新的版本哦,毕竟每个版本更新肯定会在功能或性能上有所提升,或者修复了几个Bug,但有时惰性让人不想再去研究新版本的变化,因此,提醒你别忘记了在新项目用新的一定比旧版本要好. AD: ...
- jdbc之分页查询
分页查询作为一项十分重要的数据库查询技术,在很多web项目中都会要用到,当然移动开发中也是会涉及的. 一.分页查询的sql语句: ps:为了方便阐述,下面统一使用student表作为查询的表:colN ...
- JavaScript的常见事件和Ajax小结
一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 on ...
- 九度OJ做题记录 更新.....
2015年1月7日 20:34:23 题目1007:奥运排序问题 有点意思,以后想另外方法快速做出来 2015年1月7日 21:03:56 有一个技巧就是,写了三个比较函数cmp1,cmp2,cmp ...
- FFT Golang 实现
最近项目要用到快速傅立叶变换,自己写了个算法,测试了下,性能和精度还可以接受 len,time= 1048576 378.186167ms diff=-0.00000000000225974794 I ...
- Kinetic使用注意点--circle
new Circle(config) 参数: config:包含所有配置项的对象. { radius: "半径", fill: "填充色", fillRGB: ...
- 【CSS】盒模型+选择器(你选择的要操作的对象)
盒模型 转http://www.cnblogs.com/cchyao/archive/2010/07/12/1775846.html 1.w3c标准的盒模型和ie的盒模型主要差别在于content的w ...
- 移动端webapp开发必备知识
移动设备的用户越来越多,每天android手机的激活量都已经超过130万台,所以我们面向移动终端的WebAPP也开始跟进了.本文主要介绍webapp的开发与调试的相关知识和经验,以及给出几种可选的解决 ...
- sql之表的表达式
1.派生表 实质:就是特殊的子查询(将查询结果放在from后面) 含有一张Order表: 看下面的sql语句: select orderid,orderdate,custid from ( selec ...
- 去除C/C++程序代码中的注释
最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...