题意

\(N\)个数,至多选\(k\)个,相邻两数不能同时选,问最大价值。

思路

一种假的思路:直接扔进对里面,每次都选最大的可以选的,再把两边和自己标记为不能选,一直贪心下去。是不是很有道理?

假在哪里?虽然这个是最大的,旁边两个加起来比它大,就错了。

把这个假贪心改一改,赐予它一个反悔的机会。如果它不选\(i\),那么它可以选则\(last[i]\)和\(next[i]\),这两个一定是一起选的(因为在一起才有超过\(i\)的可能)。此时它的价值为\(a[last[i]]+a[next[i]]\),原先已经选了\(a[i]\),所以就再扔一个\(a[last[i]]+a[next[i]]-a[i]\) 进去取代原来的数。由于这样选了\(2\)个数,而选一次反悔一次也恰好用掉\(2\)次机会,所以正好。

置于维护\(last、next\)只要用双向链表就好了

#include <bits/stdc++.h>
using namespace std;
pair<int,int> t;
const int N=500005;
int n,k,a[N],f[N],last[N],Next[N];
long long ans;
priority_queue <pair<int,int>> q;
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
q.push(make_pair(a[i],i));
}
for (int i=1;i<=n;i++) last[i]=i-1,Next[i]=i+1;
last[n+1]=n,Next[0]=1;
for (int i=1;i<=k;i++){
t=q.top();
while (f[t.second]) q.pop(),t=q.top();
q.pop();
if (t.first<0) break;
ans+=t.first;
int id=t.second;
f[last[id]]=f[Next[id]]=1;
a[id]=a[last[id]]+a[Next[id]]-a[id];
q.push(make_pair(a[id],id));
last[id]=last[last[id]],Next[id]=Next[Next[id]];
Next[last[id]]=id,last[Next[id]]=id;
}
printf("%lld",ans);
}

LG1484 种树的更多相关文章

  1. [Data Structure] 数据结构中各种树

    数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要 ...

  2. 种树 (codevs 1653) 题解

    [问题描述] 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1..n.每个块大小为一个单位尺寸并最多可种一棵树.每个居民想在门前种些树并指定了三个号码b,e ...

  3. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

  4. [swustoj 183] 种树

    种树(0183) 问题描述 Aconly有一块矩形的地,因为这块地里有很多石头,耕作很不方便,所以他打算在这块地上种一些果树.这块地用一个只含‘#’和‘*’的N*M的矩阵来表示,‘#’表示泥土,‘*’ ...

  5. bzoj2151 种树 双向链表+堆

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

  6. 【bzoj2151】种树

    Time Limit: 1000ms                     Memory Limit: 128MB Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府 ...

  7. BZOJ_2151_种树_贪心+堆+链表

    BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...

  8. P1250 种树

    P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...

  9. luogu P1250 种树

    我来总结一下最常用的两种办法 1.贪心 2.差分约束 那么我们先来讲,贪心版<种树> 大家可能知道有一个题和这个类似,那个是钉钉子而这个是种树 我们可以借用钉钉子的思路来想,首先这个是让你 ...

随机推荐

  1. filebeat_config

    Filebeat Prospector filebeat.prospectors: - input_type: log paths: - /var/log/apache/httpd-*.log doc ...

  2. VS中展开和折叠代码,还有其他快捷操作

    [转]VS中展开和折叠代码   VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + ...

  3. Django 序列化-token

    幂等性 幂等性:多次操作的结果和一次操作的结果是一样的 ,put请求是幂等的 post请求不是幂等的 序列化组件 全局和局部钩子函数 异常信息抛出过程 认证 路由里的,login.as_view() ...

  4. jmeter测试wordpress使用base64进行鉴权

    1.下载插件 对密码进行加密 2.安装插件 3.使用插件 4.使用base64对上面获取到的密码进行二次加密 echo -n "用户:密码" | base64 将以上命令键入lin ...

  5. docker /var/lib/docker/aufs/mnt 目录满了,全是垃圾数据

    #!/bin/sh echo "==================== start clean docker containers logs ======================= ...

  6. HTML转义字符&npsp;表示non-breaking space,unicode编码为u'\xa0',超出gbk编码范围?

    0.目录 1.参考2.问题定位不间断空格的unicode表示为 u\xa0',超出gbk编码范围?3.如何处理.extract_first().replace(u'\xa0', u' ').strip ...

  7. react-native项目中集成react-native-camera插件

    1. 安装 yarn add react-native-camera 2. 手动关联 (1)在AndroidManifest.xml中添加权限配置 <uses-permission androi ...

  8. 什么是vue

    1. 什么是vue.js? 1.1.vue.js是目前最火的一个前端框架,和Angular.js.React.js并称为前端三大主流框架. 1.2.Vue.js是有一套构建用户界面的框架,只关注视图层 ...

  9. CodeForces - 1025C 字符串处理,画一个圆。。。

    题目链接: https://vjudge.net/problem/1810469/origin 题目大意: 给你一个字符串,中间切一刀,左右两边均反转,然后右边的串拼接到左边上. 思路: 比如  aa ...

  10. XIII Open Grodno SU Championship

    A. Alice in the Wonderland 按题意模拟. #include<stdio.h> #include<iostream> #include<strin ...