problem

  • 在一条直线上有n个坑,要种k棵树。
  • 不能在相邻两个坑种树。
  • 已知在每个坑种树会有一个获利,求最大获利。
  • n<=5e5,k<=n/2

solution

  • 考虑限制条件:对于每个位置id,我们都可以选择ans = max(v[id], v[ l[ id ] ]+v[ r[ id ]])
  • 贪心:首先将全部的坑丢入大根堆中,然后从枚举1到k,每次取出获利最大的坑种树。最多种满k个坑(可以中不满,为负的话去种它就没有意义)
  • 限制:对于限制条件,我们采用缩点(对于每个点,不管选择了v[id]还是v[l[id]]+v[r[id]], 这三个位置肯定都不能用了,且选择v[l[id]]+v[r[id]]时他们左右的两个坑也没用了。于是我们新建一个点num代替这三个点,把l[l[id]],r[r[id]]连到num,再维护其左右端点值。) + 后悔(我们在堆中维护v[l[id]]+v[r[id]]-v[id],那么如果下次取出来一个正数,相当于没选之前选的v[id]而选择了新的v[l[id]]+v[r[id]]。同时相当于选择了缩点后的新节点,反之则没有[此时堆中节点值为为负数所以才不会选中,相当于新节点没选,也不需要更新左右节点值]。将新节点与左右两个坑中的节点比较作差丢入堆中。)

codes

#include<iostream>
#include<queue>
using namespace std;
const int maxn = 5e5+10;
struct node{int id, val;node(int id, int val):id(id),val(val){}bool operator < (const node & b)const{return val<b.val;}
};
priority_queue<node>q;
int l[maxn], r[maxn], data[maxn], ok[maxn];
int main(){int n,k;  cin>>n>>k;for(int i = 1; i <= n; i++){cin>>data[i];  q.push(node(i,data[i]));l[i] = i-1, r[i] = i+1;}r[0] = 1, l[n+1] = n;long long ans = 0;for(int i = 1; i <= k; i++){while(ok[q.top().id])q.pop();node t = q.top();  q.pop();if(t.val < 0)break;ans += t.val;int x = t.id;//缩点data[t.id] = data[l[t.id]]+data[r[t.id]]-data[t.id];//如果这个>0,下次还会被种到的ok[l[t.id]] = 1; ok[r[t.id]] = 1;l[t.id] = l[l[t.id]]; r[l[t.id]] = t.id;r[t.id] = r[r[t.id]]; l[r[t.id]] = t.id;q.push(node(x,data[t.id]));}cout<<ans<<'\n';return 0;
}

【Luogu1484】种树(贪心,堆)相关推荐

  1. [APIO/CTSC 2007]数据备份(贪心+堆)

    你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. ...

  2. POJ - 1456 贪心 堆常用操作 注意细节

    题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...

  3. AT3957-[AGC023F]01 on Tree【贪心,堆】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3957 题目大意 nnn个节点的一棵树,每个节点有0/10/10/1.每次删除一个根节点,然后把该节点的值填入序 ...

  4. P3620-[APIO/CTSC2007]数据备份【贪心,堆,链表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3620 题目大意 一条线上有nnn个位置,选出kkk对使得它们的距离差之和最小. 解题思路 因为一定是连接相邻的最 ...

  5. nssl1148,jzoj5461-购物【可撤回贪心,堆】

    正题 jzoj题目链接:https://jzoj.net/senior/#main/show/5461 题目大意 有n个物品,m元,k个打折券. 每个物品打折前pip_ipi​元,打折后qiq_iqi ...

  6. ssl2331OJ1373-鱼塘钓鱼 之2【贪心堆优化】

    前言 上篇:纯贪心做法 下篇:dp做法 题目:OJ1373 正题 有N个鱼塘,给出每分钟可以钓到的鱼数和每钓一次下一次钓减少的鱼数和到下一个鱼塘需要几分钟(不能回头).求限定时间内最多能够钓到的鱼数 ...

  7. 【BZOJ1826】【tyvj2644】缓存交换,贪心+堆维护

    传送门1 传送门2 写在前面:Shallwe回家养病依然努力刷题,实乃我辈楷模 思路:比较容易想到的贪心思路(虽然一开始我对这个思路有点虚,因为太弱不会证明,大体理解一下就好= =),用堆维护一下ne ...

  8. 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆

    题目描述 Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单位时间(!). ...

  9. 【贪心+堆/模拟费用流增广】BZOJ4946 [NOI2017]蔬菜

    一道思路很好的题,因为篇幅太长赶时间,以下多数转自这里 [题目] 定义了一种蔬菜为: a i , s i , c i , x i a_i,s_i,c_i,x_i ai​,si​,ci​,xi​,有 n ...

  10. BZOJ5102:[POI2018]Prawnicy(贪心,堆)

    Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...

最新文章

  1. 详细介绍Java垃圾回收机制
  2. 1996 年 3 月. IEEE 成立了 802.3z 工作组开始制定 1000Mb/s 标准。下列千兆以太网中不属于该标准的是(19)【答案】C
  3. 艾伟_转载:C# Design Patterns (3) - Decorator
  4. oracle虚拟机导入表,在Linux虚拟机上安装Oracle数据库超完整版!)
  5. context_component_san具体解释
  6. 如何优化代码节约系统资源解决重复实例化对象的问题——神奇的单例模式(C#设计模式)...
  7. 漫画算法:辗转相除法是什么鬼
  8. c语言排队系统,【分享】C语言 银行取票排队系统
  9. Go 语言为Fibonacci函数实现Read方法
  10. 关于umask函数和creat函数
  11. 18华工校赛 小马哥的超级盐水 折半枚举
  12. 网上银行说此服务器证书无效,个人网银业务操作时,系统提示“客户端证书无效”,该如何解决?...
  13. win10锁定计算机命令,win10怎么锁定磁盘 锁住win10计算机磁盘的操作步骤
  14. 手把手教你在Linux系统进行项目部署
  15. java-commons-pool2--(1)--连接池详解
  16. 微信公众号小程序实战开发vue3+nodejs+koa2+mysql+nginx阿里云部署教程
  17. 如何在 Linux 和 Unix 上安装 git?
  18. CIBERSORT进行免疫细胞组成分析
  19. YAPI的安装和使用
  20. 基于Android开发的手持扫码枪APP(附带参考源码)

热门文章

  1. C Tricks(十二)—— 获取字符数组的末尾元素
  2. utilities(matlab)—— 图像分块(image2cols、cols2image)
  3. 机器学习基础(二十三)—— 概念、定义
  4. 面向对象——私有成员
  5. 用c语言怎样将swf转化为pdf,利用ABCpdf.NET将网页转换成PDF的方法小结
  6. qml中使用combobox实现多级菜单_Excel教程:还不会做Excel三级下拉菜单?其实它跟复制粘贴一样简单...
  7. vector java 复制_Java代码性能优化的 40+ 细节
  8. python不会英语不会数学怎么自学-数学不好、英语不好、非本专业,想学Python数据分析,能安排吗?...
  9. 自学python到什么程度就可以工作-零基础学到什么程度可以找一份python工作?Python学习路线规划...
  10. python工资高还是java-未来Java、大数据、Python哪个前景更好,薪资更高?