题解 P1484 种树
题目
cyrcyr今天在种树,他在一条直线上挖了 n 个坑。
这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树。
而且由于cyrcyr的树种不够,他至多会种 k 棵树。
假设cyrcyr有某种神能力,能预知自己在某个坑种树的获利会是多少(可能为负),请你帮助他计算出他的最大获利。
思路
开始没有想到,这是一道可以反悔的贪心题。
我们可以用大根堆来维护最大获利的树,用链表来维护每棵树左右的树。
每次选择了最大的树,我们要把此树左右两边 vis 标记为1,下次枚举到vis[x] = 1时 continue。
但有可能选左右两颗树比选中间这颗树情况更优,于是我们要在加入一颗树,值为 左树权值+右树权值-中间树权值。
这样,在下一次枚举时,当我们选了这颗树,则答案增加了 左树权值+右树权值-中间树权值+中间树权值 = 左树权值+右树权值。 正好选择了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 种树的更多相关文章
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
- P1484 种树
P1484 种树 题意: 在n个数中选出至多k个数,且两两不相邻,并使所选数的和最大. n<=500000 思路 先建一个堆,把所有点扔进去,当取出队首元素时累加到答案时,把它和它左右两个点一 ...
- 洛谷 P1484 种树 题解
题面 这是一道标准的带反悔贪心: 利用大根堆来维护最大值: 当选择了num[i]后,反悔了,反之选择选了num[i-1]和num[i+1]时获利便增加了num[i-1]+num[i+1]-num[i] ...
- P1484 种树——数据结构优先队列
种了一下午的树,终于给搞明白了((多谢各位大神的题解)(题解就不能讲清楚点吗(看不见看不见))): 你有k个树,你可以种在一条直线上,每个位置都有一个价值,如果你把树种在这里就可以获得这个价值,但是条 ...
- 洛谷 P1484 种树
题目描述 cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种k棵树 ...
- [洛谷P1484] 种树
题目类型:堆+贪心 传送门:>Here< 题意:有\(N\)个坑,每个坑可以种树,且获利\(a[i]\)(可以为负).任何相邻两个坑里不能都种树,问在最多种\(K\)棵树的前提下的最大获利 ...
- 【洛谷】【堆+贪心】P1484 种树
[题目描述:] cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种 ...
- Luogu P1484 种树
这道题目还是比较简单的 首先题目的意思就让我们很轻易地想到DP 我们设f[i][j]表示前i个坑中种j棵树的最大利益,则有: f[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i ...
- 洛谷 P1484 种树(优先队列,贪心,链表)
传送门 解题思路 第一眼的贪心策略:每次都选最大的. 但是——不正确! 因为选了第i个树,第i-1和i-1棵树就不能选了.所以,要有一个反悔操作. 选了第i个后,我们就把a[i]的值更新为a[l[i] ...
随机推荐
- RocketMQ 内存优化
rocketmq官方文档 RocketMQ 的默认内存占用非常高,调整RocketMQ的内存目前我所知道的有两个方面: MQ的启动脚本可以调整内存mqbroker和mqnamesrv的配置可以调整内存 ...
- Linux MySQL分库分表之Mycat
介绍 背景 当表的个数达到了几百千万张表时,众多的业务模块都访问这个数据库,压力会比较大,考虑对其进行分库 当表的数据达到几千万级别,在做很多操作都比较吃力,考虑对其进行分库或分表 数据切分(shar ...
- 39 _ 队列5 _ 循环队列需要几个参数来确定 及其含义的讲解.swf
上面讲解都是循环队列,如果是链表实现的话就很简单,队列只有循环队列才比较复杂 此时队列中只存储一个有效元素3,当在删除一个元素的时候,队列为空,pFont向上移动,pFont等于pRear,但是此时p ...
- vwware虚拟机网卡的三种模式
这里在虚拟机中必须要保证右上角的两个勾选上 三种模式:简单一个比如宿主机器直接连接路由器上网,那虚拟机和宿主机器是一定的可以上外网,相当于虚拟机直接连接在路由器上面,虚拟机需要配置可以上外网的IP地址 ...
- Jmeter系列(32)- 详解 CSV 数据文件设置
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 了解一哈什么是 CSV 文件 为了实现 ...
- 一不小心,我就上传了 279674 字的 MySQL 学习资料到 github 上了
自从2019年11月我们出版了<千金良方--MySQL 性能优化金字塔法则>一书之后,持续不断有人来询问我MySQL 4 个系统字典库相关的问题,因为篇幅原因,书中并没有完整收录4个字典库 ...
- opencv+python实现图像锐化
突然发现网上都是些太繁琐的方法,我就找opencv锐化函数咋这么墨迹. 直接上代码: kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], ...
- 如何查看class文件的jdk版本
版权声明:本文为博主原创文章,转载请注明本文链接.文章内容如有错误望能指正,以免误导更多人. https://blog.csdn.net/gnail_oug/article/details/47145 ...
- int c, int ndigit[10]; ++ndigit[c-'0'];
for example c-'0' is an integer expression with a value between 0and 9 corresponding to the characte ...
- 一个JSON解构赋值给另一个字段不同的JSON
往数据里添加JSON字符串 // 往数据里添加JSON字符串 var arr = []; var json ={"name":"liruilong"," ...