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. jquery toggle 方法被废除的替代方法

    今天使用 toggle 方法的时候,该方法一直不能生效. 原来jquery 的引入文件是1.9,该方法在1.8以上已被废除. 那么简单的切换状态,我们可使用if 语句进行代替 如下: 记录一开始设置隐 ...

  2. JDK1.7源码分析01-Collection

    同步发布:http://www.yuanrengu.com/index.php/20180221.html Java的集合类主要由两个接口派生而出:Collection和Map.Collection是 ...

  3. 使用tdload工具将本地数据导入到Teradata数据库中

    想把本地的数据文件(比如txt.csv)中的数据导入到Teradata虚拟机中的表中.既可以使用Teradata Assistant中的import功能,也可以使用fastload导入,前者的缺点是一 ...

  4. 2015四川省acm B题

    Carries frog has n integers a1,a2,-,an, and she wants to add them pairwise. Unfortunately, frog is s ...

  5. 【Learning】最小点覆盖(二分图匹配) 与Konig定理证明

    (附一道例题) Time Limit: 1000 ms   Memory Limit: 128 MB Description 最小点覆盖是指在二分图中,用最小的点集覆盖所有的边.当然,一个二分图的最小 ...

  6. 分享一个Appium/selenium测试报告模板

    介绍 这个模板改编自 这位外国老哥 效果图 错误截图 录像 失败的case可以点击"view"查看报错信息, 也可以点击screenshot查看截图信息,更可以点击replay查看 ...

  7. H3C路由交换常用命令

    1.查看Linux下查看端口状态 root@root:~# netstat -an|grep -E "6002|6003" 2.H3C交换机显示当前配置 [H3C]display ...

  8. linux 安全基本防护 用户提权 ssh访问控制

    linu安全应用 信息安全分类: 物理安全:主机/机房环境 系统安全:操作系统 应用安全:各种网络服务,应用程序 网络安全:网络访问控制,防火墙规则 数据安全:信息的备份与恢复,加密解密 管理安全:保 ...

  9. linux 运维 nginx服务器

    nginx(web服务器) nginx是一个高性能的http和反向代理服务器,同时也是一个imap/pop3/smtp 代理服务器比apache简单官网:http://nginx.org nginx配 ...

  10. Android WebView编程的那些坑(一)

    最大的坑是ROM不同,webkit不同,差异性很大.再加上google的坑,真是坑上加坑.比如js注入问题,比如client回调接口时序问题, 比如内存回收问题,etc 1.内存泄漏问题,尤其注意An ...