BZOJ2288 【POJ Challenge】生日礼物

题意:

给一个长度为\(n\)的数组,最多可以选\(m\)个连续段,问选取的最大值是多少

题解:

先把连续的符号相同的值合并,头和尾的负数去掉

然后如果正数的数量小于等于\(m\)的话,就直接输出正数的和

否则现在存在两种操作可以减少连续段数量

  1. 少选一个正数
  2. 选上两个正数之间的负数,把两边合并

显然不可能选相邻的一正一负

现在问题转化为选择\(k\)个不连续的数,使得其绝对值的和最小

然后就和这道题一样了:BZOJ1150 [CTSC2007]数据备份Backup

//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
const int MAXN = 2e5+7; int n,m,l[MAXN],r[MAXN];
bool used[MAXN];
vector<int> A;
int sgn(int x){ return x > 0 ? 1 : -1; }
struct cmp{
bool operator () (const pair<int,int> x, const pair<int,int> y)const{
return abs(x.first) > abs(y.first);
}
};
int main(){
____();
cin >> n >> m;
for(int i = 1; i <= n; i++){
int x; cin >> x;
if(!x) continue;
if(A.empty()){
if(x<=0) continue;
A.push_back(x);
}
else{
if(sgn(x)==sgn(A.back())) A.back() += x;
else A.push_back(x);
}
}
if(!A.empty() and sgn(A.back())==-1) A.pop_back();
int cnt = 0, ret = 0;
for(int x : A) if(x>0) cnt++, ret += x;
if(cnt<=m){
cout << ret << endl;
return 0;
}
A.insert(A.begin(),-1);
priority_queue<pair<int,int>,vector<pair<int,int> >,cmp> que;
for(int i = 1; i < (int)A.size(); i++){
que.push(make_pair(A[i],i));
l[i] = i - 1; r[i] = i + 1;
}
r[A.size() - 1] = 0;
cnt -= m;
while(cnt--){
while(used[que.top().second]) que.pop();
auto p = que.top(); que.pop();
ret -= abs(p.first);
if(!l[p.second]) used[r[p.second]] = true, l[r[r[p.second]]] = 0;
else if(!r[p.second]) used[l[p.second]] = true, r[l[l[p.second]]] = 0;
else{
A.push_back(A[l[p.second]] + A[r[p.second]] + A[p.second]);
int now = A.size() - 1;
que.push(make_pair(A.back(),now));
used[l[p.second]] = used[r[p.second]] = true;
l[now] = l[l[p.second]]; r[now] = r[r[p.second]];
if(l[l[p.second]]) r[l[l[p.second]]] = now;
if(r[r[p.second]]) l[r[r[p.second]]] = now;
}
}
cout << ret << endl;
return 0;
}

2288.【POJ Challenge】生日礼物 链表+堆+贪心的更多相关文章

  1. BZOJ3502PA2012Tanie linie&BZOJ2288[POJ Challenge]生日礼物——模拟费用流+链表+堆

    题目描述 n个数字,求不相交的总和最大的最多k个连续子序列. 1<= k<= N<= 1000000. 输入 输出 样例输入 5 2 7 -3 4 -9 5 样例输出 13   根据 ...

  2. BZOJ2288:[POJ Challenge]生日礼物——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2288 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, . ...

  3. [bzoj2288][POJ Challenge]生日礼物

    用堆维护双向链表来贪心... 数据范围显然不容许O(nm)的傻逼dp>_<..而且dp光是状态就n*m个了..显然没法优化 大概就会想到贪心乱搞了吧...一开始想贪心地通过几段小的负数把正 ...

  4. BZOJ2288:[POJ Challenge]生日礼物

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  5. BZOJ 1150--数据备份(链表&堆&贪心)

    1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2572  Solved: 1038[Submit ...

  6. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  7. bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1003  Solved: 317[Submit][ ...

  8. 【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)

    2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超 ...

  9. [bzoj2288]【POJ Challenge】生日礼物_贪心_堆

    [POJ Challenge]生日礼物 题目大意:给定一个长度为$n$的序列,允许选择不超过$m$个连续的部分,求元素之和的最大值. 数据范围:$1\le n, m\le 10^5$. 题解: 显然的 ...

随机推荐

  1. PHP 获取重复数组中 第二多的元素

    $target = ["重复项目", "repeat", "repeat", "重复", "重复项目" ...

  2. Spring Boot 2.0 的配置绑定类Bindable居然如此强大

    1. 前言 在开发Spring Boot应用时会用到根据条件来向Spring IoC容器注入Bean.比如配置文件存在了某个配置属性才注入Bean : 图中红色的部分是说,只有ali.pay.v1.a ...

  3. Spark Streaming处理Flume数据练习

    把Flume Source(netcat类型),从终端上不断给Flume Source发送消息,Flume把消息汇集到Sink(avro类型),由Sink把消息推送给Spark Streaming并处 ...

  4. 【Java】面向对象 - 封装

    继承 封装 多态 重新搞一波 复习巩固 简单记录 慕课网 imooc Java 零基础入门-Java面向对象-Java封装 封装 封装是什么? 将类的某些信息隐藏在类内部,不允许外部程序直接访问 通过 ...

  5. 洛谷P3275 [SCOI2011]糖果(差分约束)

    题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  6. 使用.net中的API网关模式封装微服务

    在本文中,我们将了解如何使用API网关模式来封装微服务并抽象出底层实现细节,从而允许使用者拥有进入我们系统的一致入口点. 为了构建和测试我们的应用程序,我们需要: 1.Visual Studio 20 ...

  7. Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析

    目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...

  8. 浅谈JavaScript代码性能优化2

    一.减少判断层级 从下图代码中可以明显看出,同样的效果判断层级的减少可以优化性能 二.减少作用域链查找层级 简单解释下,下图中第一个运行foo函数,bar函数内打印name,bar作用域内没有name ...

  9. 生僻标签 fieldset 与 legend 的妙用

    谈到 <fieldset> 与 <legend>,大部分人肯定会比较陌生,在 HTML 标签中,属于比较少用的那一批. 我最早知道这两个标签,是在早年学习 reset.css ...

  10. [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本

    [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...