题目

传送门

cyrcyr今天在种树,他在一条直线上挖了 n 个坑。

这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树。

而且由于cyrcyr的树种不够,他至多会种 k 棵树。

假设cyrcyr有某种神能力,能预知自己在某个坑种树的获利会是多少(可能为负),请你帮助他计算出他的最大获利。

思路

开始没有想到,这是一道可以反悔的贪心题。

我们可以用大根堆来维护最大获利的树,用链表来维护每棵树左右的树。

每次选择了最大的树,我们要把此树左右两边 vis 标记为1,下次枚举到vis[x] = 1continue

但有可能选左右两颗树比选中间这颗树情况更优,于是我们要在加入一颗树,值为 左树权值+右树权值-中间树权值。

这样,在下一次枚举时,当我们选了这颗树,则答案增加了 左树权值+右树权值-中间树权值+中间树权值 = 左树权值+右树权值。 正好选择了2颗树。

注意:不一定要种满 k 颗树

代码

#include <cstdio>
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string> #define ll long long
#define mes(x) memset(x,0,sizeof(x))
#define re(x) read(x)
#define il inline using namespace std; template <typename T>
il void read(T &x){
x = 0; T sgn = 1; char ch = getchar();
for(;!isdigit(ch);ch = getchar()) if(ch=='-') sgn = -1;
for(;isdigit(ch);ch = getchar()) x = (x<<1)+(x<<3)+(ch^48);
x *= sgn;
} template <typename T>
il void write(T x){
if(x < 0) x = -x,putchar('-');
if(x == 0) putchar(48);
int cnt = 0, a[70];
while(x > 0){
a[++cnt] = x%10;
x /= 10;
}
for(int i = cnt;i > 0;i--){
putchar(a[i]+48);
}
putchar('\n');
} const int MAXN = 5e5+10; int n,k,a[MAXN];
bool vis[MAXN];
ll ans = 0,tot = 0; struct tree{
int pos;
ll val;
bool operator < (const tree &b) const {
return val < b.val;
}
}tr[MAXN]; struct place{
int l,r;
ll val;
}p[MAXN]; priority_queue <tree> q; il void Del(int x){
p[x].l = p[p[x].l].l;
p[x].r = p[p[x].r].r;
p[p[x].l].r = x;
p[p[x].r].l = x;
}
int main (){
re(n);re(k);
for(int i = 1;i <= n;i++){
re(a[i]);
p[i].l = i-1;
p[i].r = i+1;
p[i].val = a[i];
q.push((tree){i,a[i]});
}
for(int i = 0;i < k;i++){
int x = q.top().pos; q.pop();
if(vis[x]) {
i--;
continue;
}
vis[p[x].l] = vis[p[x].r] =1;
tot += p[x].val;
ans = max(tot,ans);
p[x].val = p[p[x].l].val + p[p[x].r].val - p[x].val;
q.push((tree){x,p[x].val});
Del(x);
}
write(ans);
return 0;
}

题解 P1484 种树的更多相关文章

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

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

  2. P1484 种树

    P1484 种树 题意: 在n个数中选出至多k个数,且两两不相邻,并使所选数的和最大. n<=500000  思路 先建一个堆,把所有点扔进去,当取出队首元素时累加到答案时,把它和它左右两个点一 ...

  3. 洛谷 P1484 种树 题解

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

  4. P1484 种树——数据结构优先队列

    种了一下午的树,终于给搞明白了((多谢各位大神的题解)(题解就不能讲清楚点吗(看不见看不见))): 你有k个树,你可以种在一条直线上,每个位置都有一个价值,如果你把树种在这里就可以获得这个价值,但是条 ...

  5. 洛谷 P1484 种树

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

  6. [洛谷P1484] 种树

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

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

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

  8. Luogu P1484 种树

    这道题目还是比较简单的 首先题目的意思就让我们很轻易地想到DP 我们设f[i][j]表示前i个坑中种j棵树的最大利益,则有: f[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i ...

  9. 洛谷 P1484 种树(优先队列,贪心,链表)

    传送门 解题思路 第一眼的贪心策略:每次都选最大的. 但是——不正确! 因为选了第i个树,第i-1和i-1棵树就不能选了.所以,要有一个反悔操作. 选了第i个后,我们就把a[i]的值更新为a[l[i] ...

随机推荐

  1. Netty中的这些知识点,你需要知道!

    一.Channel Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口. Channel是一个门面,封装了包括网络I/O及相关的 ...

  2. 微信小程序-页面跳转与参数传递

    QQ讨论群:785071190 微信小程序页面跳转方式有很多种,可以像HTML中a标签一样添加标签进行跳转,也可以通过js中方法进行跳转. navigator标签跳转 <view class=& ...

  3. [源码解析] 从TimeoutException看Flink的心跳机制

    [源码解析] 从TimeoutException看Flink的心跳机制 目录 [源码解析] 从TimeoutException看Flink的心跳机制 0x00 摘要 0x01 缘由 0x02 背景概念 ...

  4. JavaWeb网上图书商城完整项目--day02-11.激活功能流程分析

    1.当用户注册成功之后,会给用户发送邮件,当用户点击邮件的激活按钮的时候,会调用UserServlet中的activation的方法,并且会把激活码传递到后台,后台业务层对业务进行操作

  5. 浅谈bfs

    广搜(bfs) 定义 广度优先算法,简称BFS.是一种图形搜索演算法,简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,终止. 与dfs的相似之处与不同 结合深搜理解 相同点:都 ...

  6. Layui的分页模块在网站中的应用

    制作网站的时候,有时候我们常常会被一些要求复杂的分页给困住,最后要么就是写一个简单的分页,要么就做成瀑布流的形式. 有了Layui之后,我认为开发人员多了一个选择,那就是尝试用Layui内置的分页模块 ...

  7. LeetCode-Stack-Easy

    简单题 1. 有效的括号(leetcode-20) 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 1. 左括号必须用相同类型的右括 ...

  8. CSS3动画 相比JS Animation 哪个更快?

    CSS vs. JS Animation: 哪个更快? 基于JavaScript的动画竟然已经默默地比CSS的transition动画快了?而且,Adobe和 Google竟然一直在发布可以媲美原生应 ...

  9. gulp 如何排除文件和文件夹

    在网上找了好久,很多用gulp-ignore来处理,或者!来处理 经验证,gulp-ignore没有效果,如果有大神路过,还请指教:!一般的写法只能排除单个文件,以下直接写结论 1.如何排除单个文件 ...

  10. 03-springboot整合elasticsearch-源码初识

        前面两个小节已经知道了spring boot怎么整合es,以及es的简单使用,但是springboot中是怎么和es服务器交互的.我们可以简单了解一下.要看一下源码 在看源码的同时,先要对sp ...