【bzoj2151】种树
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】种树的更多相关文章
- bzoj2151 种树 双向链表+堆
2151: 种树 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1151 Solved: 613[Submit][Status][Discuss] ...
- BZOJ2151种树——模拟费用流+链表+堆
题目描述 A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这 ...
- BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)
dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...
- [BZOJ2151] 种树 贪心
2151: 种树 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1151 Solved: 613[Submit][Status][Discuss] ...
- BZOJ2151: 种树
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 题解:此题=数据备份.喜闻乐见挂链表. 代码: #include<cstdio&g ...
- bzoj1124[POI2008]枪战maf
这代码快写死我了.....死人最多随便推推结论.死人最少,每个环可以单独考虑,每个环上挂着的每棵树也可以分别考虑.tarjan找出所有环,对环上每个点,求出选它和不选它时以它为根的树的最大独立集(就是 ...
- bzoj3502[PA2012]Tanie Linie(最大k区间和)
题意:给定一个长为n的数列,要求选出最多k个不相交的区间(可以不选),使得选中的数字之和最大.(1<=k<=n<=1000000)分析:首先我们通过预处理对问题做一些简化.原序列中的 ...
- WQS二分题集
WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...
- 帝都Day4(2)——数据结构
黄姓dalao is coming! 一.栈: 基本常识略. 例题:铁轨 模拟,O(n), Usaco2006 Nov 题目略 做法:单调栈(续命栈?) n//数量 a[]//奶牛 for(int i ...
- 0x17 二叉堆
优先队列太好用了手写啥呀 poj1456 经过贪心专题的洗礼以后这题根本就不叫题啊...按时间大到小排每次取最大就好 #include<cstdio> #include<iostre ...
随机推荐
- Docker 中国官方镜像加速
参考:https://www.docker-cn.com/registry-mirror 通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像.该镜像托管于中国大陆,本 ...
- try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?
这是一道面试题,首先finally{}里面的code肯定是会执行的,至于在return前还是后, 看答案说的是在return后执行,我觉得不对,百度了一下,有说return前的,有说return后的, ...
- Ubuntu14.04上搭建FTP服务器
Ubuntu上常用的Ftp服务器是vsFTPd.安装前检查下是否已经装好了.用 sudo service vsftpd restart,如果提示重启成功之类的信息,说明此服务器已经安装好了vsFTPd ...
- 转 Caffe学习系列(9):运行caffe自带的两个简单例子
为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...
- HTML入门标签汇总
HTML入门标签汇总 1.<div></div>用于定义文档的区块,用来划分出独立不同的部分. 2.<h1></h1>数字1-6定义从大到小的标题. 3 ...
- 火狐浏览器导出EXCEL 表格,文件名乱码问题
牢骚:今天又是一个不太平的日子,打开任务表一看里面有一堆bug,其中有一个就是今天要说的这个关于商品导出的问题,本功能是临时授命接一个任务,本来呢这个导出功能在系统各大模块已经都很成熟了,但是总有一个 ...
- linux Cacti监控服务器搭建
搭建Cacti监控服务器 部署安装环境(lamp) [root@zhuji1 ~]# yum -y install httpd [root@zhuji1 ~]# yum -y install php ...
- Java Web项目(Extjs)报错五
1. Java Web项目(Extjs)报错五 具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname ...
- 错误代码: 1582 Incorrect parameter count in the call to native function 'str_to_date'
1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT t.`name`, DATE_FORMAT(str_to_d ...
- WebService之CXF注解之五(配置文件)
1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...