【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2151

【题目大意】

  在一个长度为n的数字环中挑选m个不相邻的数字使得其和最大

【题解】

  我们用大根堆和循环链表维护数字的相邻关系和删去操作,
  对于相邻点不能选取这个条件,我们在每次删去一个点之后,加入一个新的点
  权值和为周围点减去删去的点,增加反向弧,这样子就可以通过之后的选取实现退流操作
  保证答案最优。

【代码】

#include <cstdio>
#include <queue>
using namespace std;
const int N=200010;
namespace Circular_List{
bool del[N];
int n,nxt[N],pre[N],val[N];
typedef pair<int,int> P;
priority_queue<P,vector<P> > Q; // 大根堆
void Initialize(){
while(Q.size())Q.pop();
for(int i=1;i<=n;i++)pre[i]=i-1; pre[1]=n;
for(int i=1;i<=n;i++)nxt[i]=i+1; nxt[n]=1;
for(int i=1;i<=n;i++)Q.push(make_pair(val[i],i)),del[i]=0;
}
void Del(int x){
del[x]=1;
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
nxt[x]=pre[x]=0;
}
int Get(){
while(del[Q.top().second])Q.pop();
int res=Q.top().second; Q.pop();
return res;
}
}
int m;
int main(){
using namespace Circular_List;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&val[i]);
if(m>n/2){puts("Error!");return 0;}
Initialize();
int ans=0;
for(int i=1;i<=m;i++){
int x=Get();
ans+=val[x];
val[x]=val[pre[x]]+val[nxt[x]]-val[x];
Del(pre[x]); Del(nxt[x]);
Q.push(make_pair(val[x],x));
}printf("%d\n",ans);
return 0;
}

BZOJ 2151 种树(循环链表)的更多相关文章

  1. [bzoj 2151]种树(贪心)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心.想到贪 ...

  2. 【刷题】BZOJ 2151 种树

    Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度 ...

  3. bzoj 2151 种树——贪心+后悔

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 似乎是半年+前讲过的.(然而看到的时候却不会了) 考虑贪心,限制就是不能选两边的.如果 ...

  4. bzoj 2151 种树 —— 思路+链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 先都放进堆里取最大的,但选了一个就不能选它两边的,所以可能不是最优,要有“反悔”的措施 ...

  5. BZOJ 2151 种树

    贪心+priority_queue. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  6. bzoj 2151: 种树【贪心+堆】

    和数据备份差不多 设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组 因为单纯的贪心是不行的,所以设计一个"反悔"操作. 记录二元组的前驱pr后 ...

  7. 题解 bzoj 2151 种树

    题意 传送门 手写堆大法好啊,题解貌似没有结构体堆的做法,思路有些像配对堆,关于配对堆请自行百度,因为本蒟蒻不会.. 以下是蒟蒻的做法:建立一个大根堆a维护最大价值里面存入它的编号以及价值.听说配对堆 ...

  8. Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化

    https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...

  9. 【BZOJ 2151】 2151: 种树 (贪心+堆+双向链表)

    2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个 ...

随机推荐

  1. 20165230 2017-2018-2 《Java程序设计》第7周学习总结

    20165230 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十一章 JDBC与MySQL数据库 本周了解了如何在Java程序中使用JDBC语提供的AP ...

  2. Count 1 in Binary

    Count how many 1 in binary representation of a 32-bit integer. Example Given 32, return 1 Given 5, r ...

  3. java使用DOM操作XML

    XML DOM简介 XML DOM 是用于获取.更改.添加或删除 XML 元素的标准. XML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 标签是一个 ...

  4. jenkins主从服务器部署

    当服务器为linux系统但也有部分ios代码,此时就需要添加一个从jenkins以便编译ios代码.或者需要多个job同时编译这时就需要搭建主从服务器. 1.主(master)节点安装jenkins ...

  5. 读取文件和输入——read 脚本命令

    Linux之read命令使用 read命令: read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 1)read后面的变量var可以只有一个,也可以有多个,这时如果输入 ...

  6. No.19 selenium学习之路之os模块

    os模块没有什么好说的,直接看实例就可以了 读取文件内容: open只能读文件的内容,不能读文件夹的内容 常用方法: 1. os.name——判断现在正在实用的平台,Windows 返回 ‘nt'; ...

  7. ZK分布式锁(未完 待续)

    实现思路 公平锁:创建有序节点,判断本节点是不是序号最小的节点(第一个节点),若是,则获取锁:若不是,则监听比该节点小的那个节点的删除事件. 非公平锁:直接尝试在指定path下创建节点,创建成功,则说 ...

  8. 如何在VS2013创建WebService并在IIS中发布

    第一步:打开VS2013,选择文件->新建->项目. 第二步:选择[ASP.net 空web应用程序],将其命名为自己想的工程名称. 第三步:然后右键点击工程,添加->web服务.然 ...

  9. 【笔记】Python简明教程

    Python简明教程,此资源位于http://woodpecker.org.cn/abyteofpython_cn/chinese/ s=u'中文字符' #u表示unicode,使用u之后能正常显示中 ...

  10. C#基础系列 - 抽象类及其方法的学习

    在C#中使用关键字 abstract 来定义抽象类和抽象方法. 不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例. "一个包含一个或多个纯虚函数的类 ...