传送门


解题思路

第一眼的贪心策略:每次都选最大的。

但是——不正确!

因为选了第i个树,第i-1和i-1棵树就不能选了。所以,要有一个反悔操作。

选了第i个后,我们就把a[i]的值更新为a[l[i]]+a[r[i]]-a[i]。

然后这样如果发现选i-1和i+1更优时,再次加上a[i],结果就变成了a[i]+a[l[i]]+a[r[i]]-a[i]=a[l[i]]+a[r[i]]。

然后这时再更新l[i]和r[i],把左边和右边两个节点删去。

因为每一次会比上一次多种一棵,所以循环k次,求一个ans即为答案。

也许会有疑问,当i-1或i+1是负数时,不选这个负数明显更优,但是a[i-1]+a[i+1]是包含了这个负数的。

其实我们考虑,当有一个是负数,且a[i-1]+a[i+1]>a[i]时,很显然是另一个正数大于a[i],而这个正数一定会比i这棵树先种,所以不必考虑这种情况。

最后,当现在操作的最大利益已经是负数或零了,可以直接break掉,因为树是最大k棵。

AC代码

 #include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=;
int n,k,l[maxn],r[maxn],a[maxn],vis[maxn];
long long ans;
struct node{
int id,value;
bool operator < (const node &x)const{
return value<x.value;
}
node(int a,int b):id(a),value(b){}
};
priority_queue<node> q;
int main(){
cin>>n>>k;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
l[i]=i-;
r[i]=i+;
q.push(node(i,a[i]));
}
r[]=;
l[n+]=n;
while(k--){
while(vis[q.top().id]){
q.pop();
}
node x=q.top();
q.pop();
if(x.value<=) break;
ans+=x.value;
int id=x.id;
vis[l[id]]=vis[r[id]]=;
a[id]=a[l[id]]+a[r[id]]-a[id];
x.value=a[id];
r[l[l[id]]]=id;
l[r[r[id]]]=id;
l[id]=l[l[id]];
r[id]=r[r[id]];
q.push(x);
}
cout<<ans;
return ;
}

洛谷 P1484 种树(优先队列,贪心,链表)的更多相关文章

  1. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  2. [洛谷P1484] 种树

    题目类型:堆+贪心 传送门:>Here< 题意:有\(N\)个坑,每个坑可以种树,且获利\(a[i]\)(可以为负).任何相邻两个坑里不能都种树,问在最多种\(K\)棵树的前提下的最大获利 ...

  3. 洛谷 P1484 种树

    题目描述 cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种k棵树 ...

  4. 洛谷P1250种树(贪心)

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  5. 洛谷 P1484 种树 题解

    题面 这是一道标准的带反悔贪心: 利用大根堆来维护最大值: 当选择了num[i]后,反悔了,反之选择选了num[i-1]和num[i+1]时获利便增加了num[i-1]+num[i+1]-num[i] ...

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

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

  7. 【洛谷】【堆+贪心】P1484 种树

    [题目描述:] cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种 ...

  8. 洛谷P1996 约瑟夫问题【链表】

    题目:https://www.luogu.org/problemnew/show/P1996 题意: 约瑟夫环.每次取出第m个,第2m个...... 思路: 链表维护.[感觉很少有用到链表.]非常经典 ...

  9. 洛谷P4064 [JXOI2017]加法(贪心 差分)

    题意 题目链接 Sol 这题就是一个很显然的贪心... 首先二分一个答案,然后check是否可行.check的时候我们需要对每个位置\(i\),维护出所有左端点在\(i\)左侧,右端点在\(i\)右侧 ...

随机推荐

  1. spark2.1.0 自定义AccumulatorV2累加少值(线程不安全)?

    一.踩坑经历 自定义的accumulator是线程不安全的,会造成累加结果不正确.自定找了很久没想到是线程不安全行成的. 二.解决方法 创建一个线程安全的集合变量(我用的是Java的Concurren ...

  2. 树莓派开机自动启动Chomium浏览器并打开指定网页

    树莓派开机自动启动Chomium浏览器并打开指定网页 cd /home/pi/.config mkdir autostart cd autostart vi my.desktop [Desktop E ...

  3. C/C++运算符优先级关系

    C/C++优先级 从高到低 1~14梯队 1.  ()  []  .  -> 2.   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)   ...

  4. 开发一个chrome插件:将百度搜索热点屏蔽掉!

    每次百度搜索,搜索结果的右边总是出现些乱七八糟的搜索热点(推的都是些什么玩意,高校替课和我有毛关系,几个悲伤的热点我用星号顶掉了). 强迫症想把它隐藏掉,我用的是chrome浏览器,受adblock( ...

  5. 常见对象-Object类

    Object类概述 是类层次结构的根类,每个类都直接或者间接继承该类. eg: 1.class Student extends Object{}  //直接继承 2.class Student ext ...

  6. 2019 Multi-University Training Contest 3 T6 - Fansblog

    Fansblog Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  7. pycharm如何添加固定代码块

    1. file -- settings -- 搜索框输入live,找到 Live Templates 2. 选择你要添加到哪个语言中去,打开python组,并点击右上角 “+”,选择 1.Live T ...

  8. PHP 发邮件《转》

    导读:PHP自带的mail()函数,是php内置发邮件的函数,该函数虽然简单,但是要想真正可以发邮件得有很复杂的配置.不适合新手,以及项目实际的应用的开发. php的mail()函数复杂配置,使得直接 ...

  9. 苹果cms v10官网下载

    苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统.经过近多年的开发经验和技术积累,苹果CMS程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者.程序体积小-> ...

  10. springboot(三).springboot用最简单的方式整合mybatis

     Springboot整合mybatis 在众多的orm框架中,我使用最多的,最习惯的,也是目前使用最广泛的就是mybatis,接下来我们就去将springboot整合mybatis 对于spring ...