背景描述

一排 N 个数, 第 i 个数是 Ai , 你要找出 K 个不相邻的数, 使得他们的和最大。

请求出这个最大和。

输入格式

第一行两个整数 N 和 K。

接下来一行 N 个整数, 第 i 个整数表示 Ai 。

输出格式

一行一个整数表示最大和, 请注意答案可能会超过 int 范围

样例输入

3 2

4 5 3

样例输出

7

数据范围

对于 20% 的数据, N, K ≤ 20 。

对于 40% 的数据, N, K ≤ 1000 。

对于 60% 的数据, N, K ≤ 10000 。

对于 100% 的数据, N, K ≤ 100000 , 1 ≤ Ai ≤ 1000000000。

第一眼看以为是个思博 $DP$ , 然后发现数据范围 $1 \times 10^{5}$ ...一股子 $O(nlog(n))$ 的味道...

一脸懵逼.png

然后就开始各种瞎**优化然后转背包然后就变成了 $60\%$ 的 $O(n^2)$ 算法.

正解果然特么是个贪心.

首先把所有的点都怼进一棵平衡树, 以权值降序第一关键字, 下标升序为第二关键字排序. 然后建立一个链表保存左侧第一个存在结点与右侧第一个存在结点的下标.

然后每次取值最大的元素, 将它和它左右的结点的数据从平衡树中删除, 再把对应的数据改成它的左侧结点与右侧结点的和减去它本身(为了保留不再选取该结点而改选两侧结点的可能性与结果的正确性). 然后修改联保中保存的左侧第二个与右侧第二个元素的右侧/左侧结点下标.

一直贪心 $k$ 次即可得解.总时间复杂度约为 $O(nlog(n))$

参考代码:

GitHub

 #include <set>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define int long long
const int MAXN=;
const long long INF=0x3FFFFFFFFFFFFFFF; struct Node{
long long value;
int pos;
Node(long long value=,int pos=){
this->value=value;
this->pos=pos;
}
bool friend operator <(const Node &tmp,const Node &y){
return tmp.value!=y.value?tmp.value>y.value:tmp.pos<y.pos;
}
}; int n;
int k;
long long ans;
int next[MAXN];
int front[MAXN];
std::set<Node> s;
long long data[MAXN]; void Initialize();
void Delete(int); signed main(){
Initialize();
while(k--){
int tmp=s.begin()->pos;
ans+=data[tmp];
data[tmp]=data[front[tmp]]+data[next[tmp]]-data[tmp];
s.erase(s.begin());
s.erase(Node(data[front[tmp]],front[tmp]));
s.erase(Node(data[next[tmp]],next[tmp]));
s.insert(Node(data[tmp],tmp));
Delete(tmp);
}
printf("%lld\n",ans);
return ;
} void Delete(int tmp){
if(front[front[tmp]]){
next[front[front[tmp]]]=tmp;
}
if(next[next[tmp]]){
front[next[next[tmp]]]=tmp;
}
front[tmp]=front[front[tmp]];
next[tmp]=next[next[tmp]];
} void Initialize(){
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;i++){
scanf("%lld",data+i);
front[i]=i-;
next[i]=i+;
s.insert(Node(data[i],i));
}
data[]=-INF;
next[n]=;
}

Backup

以及日常图包

[DBSDFZOJ 多校联训] 就的更多相关文章

  1. [DBSDFZOJ 多校联训] Password

    Password password.in/.out 描述 你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s ...

  2. Contest1893 - 2019年6月多校联训b层测试1

    传送门 密码:waxadyt T1 暴力 对于任意相邻的两个值 中间能到达的最大高度是固定的 加上头尾,判一下就好了 代码//感谢Th Au K #include<bits/stdc++.h&g ...

  3. 2019西安多校联训 Day5

    T1 光哥为了不让某初二奆佬恶心到我们而留下的火种 (貌似没这题平均分就100-了) 思路:就一横一竖让后就gztopa嘛 #include <bits/stdc++.h> using n ...

  4. 2019西安多校联训 Day4

    T1 大水题!!难度简单,显然的贪心策略即可,but... 思路:首先我们按与i点作战后活下来的士兵排序,然后 若当前剩余兵力足够直接减掉战斗死亡人数,如果不够就加 够再打它,但是!我们在考完试观察测 ...

  5. 2019西安多校联训 Day3

    试题链接:http://www.accoders.com/contest.php?cid=1895    考试密码请私信; 特别鸣谢:zkc奆佬帮助我优化本篇题解(语言表达方面) T1 显然二分求解的 ...

  6. 2019西安多校联训 Day2

    试题链接:http://www.accoders.com/contest.php?cid=1894   考试密码请私信; T1 残忍WA 0,明明就是一道非常菜的字符串QAQ 思路:一共找四种东西,A ...

  7. 2019西安多校联训 Day1

    试题链接:http://www.accoders.com/contest.php?cid=1893  考试密码请私信;    T1 明明就是O(n)的模拟,强行打成二分QAQ 思路:判断收尾是否为1或 ...

  8. 三校联训 【NOIP模拟】寻找

    题面 “我有个愿望,我希望穿越一切找到你.” 这是个二维平面世界,平面上有n个特殊的果实,我从(0,0)点出发,希望得到尽量多的果实,但是出于某种特殊的原因,我的运动方式只有三种(假设当前我在(x,y ...

  9. 三校联训 小澳的葫芦(calabash) 题解

    题面:小澳的葫芦[ 题目描述]小澳最喜欢的歌曲就是<葫芦娃>.一日表演唱歌,他尽了洪荒之力,唱响心中圣歌.随之,小澳进入了葫芦世界.葫芦世界有 n 个葫芦,标号为 1~ n. n 个葫芦由 ...

随机推荐

  1. java的文件操作类File

    java.io.File类,是java获取文件/文件夹的所有属性,和完成所有相关操作的类 例子: package test.file.IO; import java.io.*; public clas ...

  2. Java 中 String 的常用方法(二)

    本文介绍剩下的一些常用的 String 中的方法. 1.replace 方法 .replaceFirst 方法和 replaceAll 方法 replace(char oldChar, char ne ...

  3. 更改SQLServer实例默认字符集

    转自http://www.cnblogs.com/fygh/archive/2012/05/15/2501598.html 需求 安装数据库时,将字符集安装成了“SQL_Latin1_General_ ...

  4. Http协议之Content-Length

    前言 http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了.有长连接相关的,有报文解析相关的.对http协议不能一知半解,必须透彻理解才行.所以就写 ...

  5. R语言格式化数字和字符串format函数

    数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justi ...

  6. 吴恩达《深度学习》第五门课(1)循环序列模型(RNN)

    1.1为什么选择序列模型 (1)序列模型广泛应用于语音识别,音乐生成,情感分析,DNA序列分析,机器翻译,视频行为识别,命名实体识别等众多领域. (2)上面那些问题可以看成使用(x,y)作为训练集的监 ...

  7. vue中添加Echarts图表的使用,Echarts的学习笔记

    项目中需要使用一些折线图.柱状图.饼状图等等,之前使用过heightCharts(关于heightCharts请看我的另一篇 http://www.cnblogs.com/jasonwang2y60/ ...

  8. 如何创建一个基于Node的HTTP服务器

    首先创建一个HTTP服务器. var http = require('http'); function serve(request,response) { console.log(request.me ...

  9. JS中的 ES6新类型iterable

    1.1 iterable字面意思:可迭代的,可重复的 iterable是ES6标准引入的新的类型.而Array.Map和Set都属于iterable类型 1.2 为什么加入iterable类型? 遍历 ...

  10. JQuery语法 JQuery对象与原生对象互转 文档就绪函数与window.onload的区别

    [JQuery语法] 1.jQuery("选择器").action();通过选择器调用事件函数,但是jquery中,jquery可以用$(“选择器”).action();   ① ...