Time Limit: 1000ms                     Memory Limit: 128MB

Description

A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。

Input

输入的第一行包含两个正整数n、m。第二行n个整数Ai。

Output

输出一个整数,表示最佳植树方案可以得到的美观度。如果无解输出“Error!”,不包含引号。

Sample Input

【样例输入1】
7 3
1 2 3 4 5 6 7
【样例输入2】
7 4
1 2 3 4 5 6 7

Sample Output

【样例输出1】
15

【样例输出2】
Error!

HINT

【数据规模】

对于全部数据:$m<=n<=200000$,$-1000<=Ai<=1000$

[吐槽]

  所以说为啥一开始我想的是dp。。看到数据范围瞬间爆炸qwq

[题解]

  那就考虑贪心咯?每次选最大值

  问题是选完了一个数之后旁边两个不能选然后这个有个连锁反应的感觉。。

  但是我们可以发现在我们选择了一个位置$a_i$之后,可以直接用$a_{i-1} + a_{i+1} - a_i$这一个值来把$a_i$抵消掉

  既然这样,那就可以直接在选了一个数$a_i$之后,把这个数旁边的两个删掉,然后把$a_i$的值改成上面的用来抵消的值

  然后神奇的地方就在于这样改了之后,其实在选的时候也能起到一个连锁反应的效果

  所以就相当于把这个限制条件也变成了一种选数的操作

  那么贪心一下就直接一个优先队列每次选最大就搞定啦

  (讲真好妙啊qwq)

[一些细节]

  好像也不算什么细节吧。。就是实现的时候要开两个数组记录一下前面和后面是谁因为要一直删数所以会变的

  然后就是已经删掉的数要标记一下如果说队头是被删过的数那就继续pop

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=+;
struct data
{
int id,val;
data(){}
data(int x,int y) {id=x,val=y;}
friend bool operator < (data x,data y)
{return x.val<y.val;}
};
priority_queue<data> q;
bool out[MAXN];
int a[MAXN],pre[MAXN],nxt[MAXN];
int n,m,ans;
int prework();
int del(int x); int main()
{
freopen("a.in","r",stdin); int x;
scanf("%d%d",&n,&m);
if (m>n/) {printf("Error!\n");return ;}
for (int i=;i<=n;++i) scanf("%d",a+i),q.push(data(i,a[i]));
prework();
memset(out,false,sizeof(out));
data now;
for (int i=;i<=m;++i)
{
while (out[q.top().id]) q.pop();
now=q.top();q.pop();
ans+=a[now.id];
a[now.id]=a[pre[now.id]]+a[nxt[now.id]]-a[now.id];
del(pre[now.id]);
del(nxt[now.id]);
q.push(data(now.id,a[now.id]));
}
printf("%d\n",ans);
} int prework()
{
for (int i=;i<=n;++i) pre[i]=i-;
for (int i=;i<n;++i) nxt[i]=i+;
pre[]=n; nxt[n]=;
} int del(int x)
{
out[x]=true;
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
}

挫挫滴代码

【bzoj2151】种树的更多相关文章

  1. bzoj2151 种树 双向链表+堆

    2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1151  Solved: 613[Submit][Status][Discuss] ...

  2. BZOJ2151种树——模拟费用流+链表+堆

    题目描述 A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这 ...

  3. BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)

    dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...

  4. [BZOJ2151] 种树 贪心

    2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1151  Solved: 613[Submit][Status][Discuss] ...

  5. BZOJ2151: 种树

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 题解:此题=数据备份.喜闻乐见挂链表. 代码: #include<cstdio&g ...

  6. bzoj1124[POI2008]枪战maf

    这代码快写死我了.....死人最多随便推推结论.死人最少,每个环可以单独考虑,每个环上挂着的每棵树也可以分别考虑.tarjan找出所有环,对环上每个点,求出选它和不选它时以它为根的树的最大独立集(就是 ...

  7. bzoj3502[PA2012]Tanie Linie(最大k区间和)

    题意:给定一个长为n的数列,要求选出最多k个不相交的区间(可以不选),使得选中的数字之和最大.(1<=k<=n<=1000000)分析:首先我们通过预处理对问题做一些简化.原序列中的 ...

  8. WQS二分题集

    WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...

  9. 帝都Day4(2)——数据结构

    黄姓dalao is coming! 一.栈: 基本常识略. 例题:铁轨 模拟,O(n), Usaco2006 Nov 题目略 做法:单调栈(续命栈?) n//数量 a[]//奶牛 for(int i ...

  10. 0x17 二叉堆

    优先队列太好用了手写啥呀 poj1456 经过贪心专题的洗礼以后这题根本就不叫题啊...按时间大到小排每次取最大就好 #include<cstdio> #include<iostre ...

随机推荐

  1. Redis 实践3-操作

    string常用操作 set key1  aminglinux get key1   set key1  aming //一个key对应一个value,多次赋值,会覆盖前面的value setnx k ...

  2. angular+require前端项目架构搭建

    app //应用入口 directive //自定义指令 require-main //require的主配置文件  存放公共调用的js service //请求后端数据公有类 controllers ...

  3. 使用PowerDesigner对NAME和COMMENT互相转换

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 在使用PowerDesigner对数据库进行概念模型和物理模型设计时 ...

  4. HTML5-svg圆形饼状图进度条实现原理

    <svg width="440" height="440" viewbox="0 0 440 440"> <circle ...

  5. haproxy下X-Frame-Options修复方法

    X-Frame-Options是网页常见漏洞之一,在其他的frame下加载你网页的内容,达到劫持的目的. 修复方法很简单,在http 请求投中添加X-Frame-Options参数.网上可以查一下Ap ...

  6. 可拖动布局之Gridster

    看过bootstrap可视化布局系统的人是不是都会对页面元素的拖拽有着很大的兴趣?下面呢,楼主就给大家讲两个楼主知道的拖拽小插件吧. 一.gridster 1.了解gridster 后续官网:http ...

  7. mongodb的TTL索引介绍(超时索引)

    TTL索引是mongodb新支持的用于延时自动删除记录的一种索引.它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引.可以指定某条记录在延时固定时间后自动删除.数据自动超时删除主要用 ...

  8. python多版本以及各种包管理

    python多版本以及各种包管理 python 包管理 各个版本 python版本管理 由于Python有2.x和3.x两个大的版本,而且每一个工程建立所用的各种包的版本也不尽相同(如flask1.x ...

  9. spring 代码中获取ApplicationContext(@AutoWired,ApplicationListener)

    2017年度全网原创IT博主评选活动投票:http://www.itbang.me/goVote/234    学习spring框架时间不长,一点一滴都得亲力亲为.今天忽然觉得老是通过@Autowir ...

  10. Yii2框架ACF(AccessControl Filter)的使用

    AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述. ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控 ...