2288.【POJ Challenge】生日礼物 链表+堆+贪心
BZOJ2288 【POJ Challenge】生日礼物
题意:
给一个长度为\(n\)的数组,最多可以选\(m\)个连续段,问选取的最大值是多少
题解:
先把连续的符号相同的值合并,头和尾的负数去掉
然后如果正数的数量小于等于\(m\)的话,就直接输出正数的和
否则现在存在两种操作可以减少连续段数量
- 少选一个正数
- 选上两个正数之间的负数,把两边合并
显然不可能选相邻的一正一负
现在问题转化为选择\(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】生日礼物 链表+堆+贪心的更多相关文章
- BZOJ3502PA2012Tanie linie&BZOJ2288[POJ Challenge]生日礼物——模拟费用流+链表+堆
题目描述 n个数字,求不相交的总和最大的最多k个连续子序列. 1<= k<= N<= 1000000. 输入 输出 样例输入 5 2 7 -3 4 -9 5 样例输出 13 根据 ...
- BZOJ2288:[POJ Challenge]生日礼物——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2288 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, . ...
- [bzoj2288][POJ Challenge]生日礼物
用堆维护双向链表来贪心... 数据范围显然不容许O(nm)的傻逼dp>_<..而且dp光是状态就n*m个了..显然没法优化 大概就会想到贪心乱搞了吧...一开始想贪心地通过几段小的负数把正 ...
- BZOJ2288:[POJ Challenge]生日礼物
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ 1150--数据备份(链表&堆&贪心)
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2572 Solved: 1038[Submit ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1003 Solved: 317[Submit][ ...
- 【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超 ...
- [bzoj2288]【POJ Challenge】生日礼物_贪心_堆
[POJ Challenge]生日礼物 题目大意:给定一个长度为$n$的序列,允许选择不超过$m$个连续的部分,求元素之和的最大值. 数据范围:$1\le n, m\le 10^5$. 题解: 显然的 ...
随机推荐
- 【JDBC核心】批量插入
批量插入 批量执行 SQL 语句 当需要成批插入或者更新记录时,可以采用 Java 的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率. JDBC 的批量 ...
- 【C++】《C++ Primer 》第十二章
第十二章 动态内存 目前为止,所使用的对象都有着严格定义的生存期. 全局对象在程序启动时分配,在程序结束时销毁.局部自动对象在进入其定义所在的程序块时被创建,在离开块时销毁.局部static对象在第一 ...
- Java 设置Excel条件格式(高亮条件值、应用单元格值/公式/数据条等类型)
概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条 ...
- 基于B/S架构的在线考试系统的设计与实现
前言 这个是我的Web课程设计,用到的主要是JSP技术并使用了大量JSTL标签,所有代码已经上传到了我的Github仓库里,地址:https://github.com/quanbisen/online ...
- 【JS学习】String基础方法
前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 目录 定义: 字符串的连接: 标签模板的使用: 字符串的基本方 ...
- Nginx基础知识学习(安装/进程模型/事件处理机制/详细配置/定时切割日志)
一.Linux下Nginx的安装 1.去官网 http://nginx.org/download/下载对应的Nginx安装包,推荐使用稳定版本. 2.上传Nginx到Linux服务器. 3.安装依赖环 ...
- python学习笔记 | wordcloud安装指南
问题: 直接在命令行输入: pip install wordcloud 不出意外,直接报错,显示缺失vc*****.bat,意思是缺失vc版本,这个安装方式基本可以扔掉. 解决: http://t.c ...
- java进阶(31)--TreeSet集合、TreeMap集合、自平衡二叉树
一.TreeSet集合简单 1.TreeSet集合底层是一个TreeMap 2.TreeMap集合底层是一个二叉树 3.放到TreeSet集合的元素等同于放到TreeMap集合的Key部分 4.Tre ...
- docker 镜像导入load、导出save以及重命名
docker 导入导出操作 save 保存(导出)镜像 # 把镜像打包成 .tar # -o 要保存路径.tar # > 要保存路径.tar # docker save 镜像id > /存 ...
- grep和egrep
grep nobody /etc/passwd 显示/etc/passwd中带有nobody字样的行,区分大小写 grep -i nobody /etc/passwd 现实/etc/passwd中 ...