题目

传送门

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. 【spring】循环依赖 Java Vs Spring

    菜瓜:水稻,这次我特意去看了java的循环依赖 水稻:哟,有什么收获 菜瓜:两种情况,构造器循环依赖,属性循环依赖 构造器循环依赖在逻辑层面无法通过.对象通过构造函数创建时如果需要创建另一个对象,就会 ...

  2. Scanner扫描器的使用

    Scanner:扫描器,可以通过Scanner类扫描用户在控制台录入的数据. 1.导包 //导包快捷键Alt+Enter 2.创建键盘录入对象 //键盘录入对象的名称为 “sc” 3.接收数据 //将 ...

  3. linux环境下搭建Jenkins持续集成(Jenkins+git+shell+maven+tomact)

    准备环境 jenkins.war包 ,jdk1.8  ,tomact , maven,git 1.Jenkins  war包,下载地址https://jenkins.io/zh/download/  ...

  4. 面试题40:最小的 k 个数

    import java.util.Arrays; /** * Created by clearbug on 2018/2/26. * * 面试题40:最小的 k 个数 * * 注意:因为前两天在陌陌面 ...

  5. redis高级命令3哨兵模式

    redis的哨兵模式 现在我们在从服务器1.222上让该从服务器作为哨兵 首先将redis安装包文件下的sentinel.conf文件复制到/usr/local/redis/etc目录下 然后修改se ...

  6. Mariadb之显式使用表锁和行级锁

    首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁 ...

  7. Nginx 从入门到放弃(二)

    学习完了nginx的基本知识后,我们来了解下nginx的虚拟主机. 说到虚拟主机,那就得说一说虚拟主机的三种方式了 基于端口的虚拟主机 基于域名的虚拟主机 基于ip的虚拟主机 基于端口实现虚拟主机 只 ...

  8. 手写SpringMVC框架(三)-------具体方法的实现

    续接前文 手写SpringMVC框架(二)结构开发设计 本节我们来开始具体方法的代码实现. doLoadConfig()方法的开发 思路:我们需要将contextConfigLocation路径读取过 ...

  9. 01 . SaltStack部署配置及简单应用

    SaltStack简介 SaltStack saltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递. saltstack是使 ...

  10. css如何让文字不换行显示?

    在CSS中,可以通过white-space属性来实现文字不换行显示:只要将white-space属性的值为nowrap就可强制文字不换行. white-space属性指定元素内的空白怎样处理.它有以下 ...