bzoj 2151: 种树【贪心+堆】
和数据备份差不多
设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组
因为单纯的贪心是不行的,所以设计一个“反悔”操作。
记录二元组的前驱pr后继ne,把拿出来的二元组的len加进答案,然后把当前二元组和它的前驱后继当成一个,也就是len[x]=a[pr[x]]+a[ne[x]]-a[x],相应修改前驱后继,然后“删掉”前驱后继的二元组,这样的意思是如果再次选了修改过的二元组x,就意味着退还掉x,选择它的前驱后继,易证这样个数和ans都不会受影响。
至于用stl如何执行删除?可以把要的点的len设为inf,这样每次操作前先弹掉x与len[x]不符的点就相当于删除操作了。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=200005;
int n,m,ans,a[N],pr[N],ne[N];
struct qwe
{
int p,v;
qwe(int P=0,int V=0)
{
p=P,v=V;
}
bool operator < (const qwe &b) const
{
return v<b.v;
}
};
priority_queue<qwe>q;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
q.push(qwe(i,a[i]));
pr[i]=i-1,ne[i]=i+1;
}
pr[1]=n,ne[n]=1;
if(2*m>n)
{
puts("Error!");
return 0;
}
for(int i=1;i<=m;i++)
{
while(!q.empty()&&a[q.top().p]!=q.top().v)
q.pop();
int x=q.top().p,l=pr[x],r=ne[x];
q.pop();
ans+=a[x];
pr[ne[x]=ne[r]]=x;
ne[pr[x]=pr[l]]=x;
a[x]=a[l]+a[r]-a[x];
a[l]=a[r]=1e9;
q.push(qwe(x,a[x]));
}
printf("%d\n",ans);
return 0;
}
bzoj 2151: 种树【贪心+堆】的更多相关文章
- bzoj 2151 种树——贪心+后悔
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 似乎是半年+前讲过的.(然而看到的时候却不会了) 考虑贪心,限制就是不能选两边的.如果 ...
- [bzoj 2151]种树(贪心)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心.想到贪 ...
- 【刷题】BZOJ 2151 种树
Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度 ...
- BZOJ 2151 种树(循环链表)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2151 [题目大意] 在一个长度为n的数字环中挑选m个不相邻的数字使得其和最大 [题解] ...
- bzoj 2151 种树 —— 思路+链表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 先都放进堆里取最大的,但选了一个就不能选它两边的,所以可能不是最优,要有“反悔”的措施 ...
- BZOJ 2151 种树
贪心+priority_queue. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- 题解 bzoj 2151 种树
题意 传送门 手写堆大法好啊,题解貌似没有结构体堆的做法,思路有些像配对堆,关于配对堆请自行百度,因为本蒟蒻不会.. 以下是蒟蒻的做法:建立一个大根堆a维护最大价值里面存入它的编号以及价值.听说配对堆 ...
- Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化
https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...
- 【BZOJ 2151】 2151: 种树 (贪心+堆+双向链表)
2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个 ...
随机推荐
- ibatis中的xml配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...
- WordPress升级错误:class-wp-filesystem-direct.php on line 122
错误描述:WordPress在后台进行版本升级时,出错,之后进入前台或者后台,都无法访问进入,错误信息如下:Warning: copy(/home/xxx/public_html/wordpress/ ...
- React学习及实例开发(一)——开始
本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.构建一个新项目 1.命令行运行如下命令,构建一个新的react项目 npm install -g crea ...
- eclipse设置每次提交代码忽略target、.settings、.svn、.project文件
- MySQL学习系列之触发器
触发器简介 触发器作用: 监控某种事件并触发某种动作 触发语法: CREATE TRIGGER trigger_name trigger_event ON tbl_name FOR EACH ROW ...
- Android中AsyncTask使用具体解释
在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handl ...
- 看懂JSP声明的格式。。。
在WebRoot下新建test3.jsp 改动body内容: <%! int a = 3; %> <% int b = 3; %> <%= a-- %& ...
- JSONObjectWithData方法里options參数选择解释
NSJSONReadingMutableContainers Specifies that arrays and dictionaries are created as mutable object ...
- IO获取指定目录及其目录下子目录
一.需求:获取指定目录下,指定扩展名的文件(包含子目录中的) 二.需要用到的方法 1.FilenameFilter :返回抽象路径名的定义中表示此抽象路径名的目录中的文件的数组. filter.ac ...
- bzoj3109【CQOI2013】新数独
3109: [cqoi2013]新数独 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 365 Solved: 229 [Submit][Statu ...