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. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (II)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架 II第二部 0. 本系列教程 1. 登录功能准备 a.python中操控mysql b. 安装数据库 c.安装mys ...

  2. 【SpringBoot1.x】SpringBoot1.x 入门

    SpringBoot1.x 入门 文章源码 简介 传统的 JavaEE 开发,十分笨重且配置繁琐,开发效率很低,而且有很复杂的部署流程,对于第三方技术的集成也很困难. Sring 全家桶时代则解决了上 ...

  3. docker基础总结

    搜索镜像docker search ubuntu 搜索ubuntu的Docker镜像 搜索结果单个单词ubuntu这样的镜像,被称为基础镜像或根镜像,这些基础镜像由 Docker 公司创建搜索结果ti ...

  4. python模块详解 | shutil

    简介: shutil是python的一个内置模块,提供了许多关于文件和文件集合的高级操作,特别提供文件夹与文件操作.归档操作了支持文件复制和删除的功能. 文件夹与文件操作: copyfileobj(f ...

  5. 【Web】CSS实现鼠标悬停实现显示与隐藏 特效

    鼠标悬停实现显示与隐藏特效 简单记录 - 慕课网 Web前端 步骤四:鼠标悬停实现显示与隐藏特效 初步掌握定位的基本使用,以及CSS选择器更高级的运用,完成一个网页中必会的鼠标经过隐藏显示特效. 实现 ...

  6. tomcat控制台运行窗口中文乱码

    启动tomcat时出来的运行窗口中文乱码, 如图所示:看得有点不舒服 解决方法:找到Tomcat安装路径下的 /conf/logging.properties 文件 文件末尾添加语句: java.ut ...

  7. SVM 支持向量机算法-原理篇

    公号:码农充电站pro 主页:https://codeshellme.github.io 本篇来介绍SVM 算法,它的英文全称是 Support Vector Machine,中文翻译为支持向量机. ...

  8. HTML基础复习2

    6.表格 6.1建立表格: 表格由<table></table>标签来定义 每行由<tr></tr>来定义,每行被分割为若干单元格,由<td> ...

  9. 获取html中某些标签的值

    一.获取单选按钮radio的值 <!doctype html> <html lang="en"> <head> <meta charset ...

  10. 推荐几个学习Python的免费网站

    想要学好Python,只靠看Python相关的书籍是远远不够的!今天为大家分享几个实用的Python学习网站. 欢迎各位热爱Python的小伙伴进群交流:610380249群里有大佬哦,而且很热心,群 ...