2288: 【POJ Challenge】生日礼物
2288: 【POJ Challenge】生日礼物
https://lydsy.com/JudgeOnline/problem.php?id=2288
分析:
贪心+堆+链表。
首先把序列变一下,把相邻的同符号的合并起来,让序列的第一个是整数,最后一个也是整数。
如果直接算最大的选的不好算,那么考虑算最小的不选的,正难则反。
然后把所有的整数都加起来,这就是最大的共和。如果此时的段数<=m,那么直接输出就好了。否则,需要选几个数字,来合并它左右的段,以此是段的总数-1。
选的是一个负数,表示,左边的段后右边的段经过这个负数合起来了。选的是一个正数,那么表示这个正数不要了。由于减去的都是绝对值的大小,那么可以把序列变成正的。此时问题转化为,选k个数,使得它们的和最小,并且不能相邻。
然后用堆+链表维护。类似上一道题。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const int INF = 1e9; struct Node{
int x, id;
Node() {}
Node(int a,int b) { x = a, id = b; }
bool operator < (const Node &A) const {
return x > A.x;
}
};
priority_queue< Node > q;
int pre[N], nxt[N], vis[N], a[N], b[N];
int cnt; void del(int x) {
if (!x || x == cnt + ) return ;
vis[x] = ;
b[x] = INF;
nxt[pre[x]] = nxt[x];
pre[nxt[x]] = pre[x];
} int main() {
int n = read(), m = read(); cnt = ; b[] = a[] = read();
int last = a[];
for (int i = ; i <= n; ++i) {
a[i] = read();
if (a[i] == ) continue;
if (a[i] * last < ) b[++cnt] = a[i];
else b[cnt] += a[i];
last = a[i];
}
if (b[cnt] < ) cnt --;
if (b[] < ) { cnt --; for (int i = ; i <= cnt; ++i) b[i] = b[i + ]; }
int ans = , d = ;
for (int i = ; i <= cnt; ++i) {
if (b[i] > ) ans += b[i], d ++;
else b[i] = -b[i];
q.push(Node(b[i], i));
}
if (d <= m) { cout << ans << " "; return ; }
else d = d - m; b[] = INF, b[cnt + ] = INF;
for (int i = ; i <= cnt + ; ++i) nxt[i] = i + , pre[i] = i - ;
pre[] = ; nxt[cnt + ] = cnt + ; while (d --) {
while (vis[q.top().id]) q.pop();
Node now = q.top(); q.pop();
int i = now.id; ans -= now.x;
int t = min(INF, b[pre[i]] + b[nxt[i]] - now.x);
del(pre[i]), del(nxt[i]);
b[i] = t; q.push(Node(b[i], i));
}
cout << ans;
return ;
}
2288: 【POJ Challenge】生日礼物的更多相关文章
- BZOJ2288:[POJ Challenge]生日礼物——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2288 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, . ...
- BZOJ2288:[POJ Challenge]生日礼物
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- [bzoj2288][POJ Challenge]生日礼物
用堆维护双向链表来贪心... 数据范围显然不容许O(nm)的傻逼dp>_<..而且dp光是状态就n*m个了..显然没法优化 大概就会想到贪心乱搞了吧...一开始想贪心地通过几段小的负数把正 ...
- BZOJ3502PA2012Tanie linie&BZOJ2288[POJ Challenge]生日礼物——模拟费用流+链表+堆
题目描述 n个数字,求不相交的总和最大的最多k个连续子序列. 1<= k<= N<= 1000000. 输入 输出 样例输入 5 2 7 -3 4 -9 5 样例输出 13 根据 ...
- 【链表】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. 她被允许选择不超 ...
- 2288.【POJ Challenge】生日礼物 链表+堆+贪心
BZOJ2288 [POJ Challenge]生日礼物 题意: 给一个长度为\(n\)的数组,最多可以选\(m\)个连续段,问选取的最大值是多少 题解: 先把连续的符号相同的值合并,头和尾的负数去掉 ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
随机推荐
- Inno Setup添加中文安装语言文件
如果你不添加中文安装语言文件,你编译生成的安装包的语言是不会有中文. 一,打开软件安装目录下的Languages文件夹下,有如下好多文件,可是就是没有Chianese.isl. 好了,你只需要随便拷贝 ...
- TensorFlow函数(四)tf.trainable_variable() 和 tf.all_variable()
tf.trainable_variable() 此函数返回的是需要训练的变量列表 tf.all_variable() 此函数返回的是所有变量列表 v = tf.Variable(tf.constant ...
- TensorFlow学习('utf-8' codec can't decode byte 0xff in position 0: invalid start byte)
使用语句: image_raw_data = tf.gfile.GFile("./picture.jpg", "r").read() 读取图像时报错如下: Un ...
- java学习笔记 --- 多线程(多线程的控制)
1.线程休眠 public static void sleep(long millis) public class ThreadSleep extends Thread { @Override ...
- IntelliJ IDEA隐藏不想看到的文件或文件夹
打开IntelliJ IDEA,File -> Settings -> Editor -> File Types 在红框部分加上你想过滤的文件或文件夹名
- HBase可靠性管理方法浅析
HBase是一个可以进行实时读和写操作的分布式NoSQL系统,建立在HDFS之上,是Hadoop生态圈中重要的一部分.在HBase中底层存储结构采用的LSM-tree的方式进行处理,为了保证HBase ...
- Oracle服务
oracle服务 参考网址:http://www.oraclejsq.com/article/010100132.html Oracle在window下安装完毕,会安装很多服务,如下图: 1.Orac ...
- 初识ExtJS 6----自学笔记(一)
一.使用环境 这一点写在前面,是为了方便大家在找资料的时候可以直接定位环境版本. ExtJS版本 6.2 中文官方网站提供版本,网站地址http://extjs.org.cn/node/793 开发 ...
- functional filter()
#include "pch.h" #include <iostream> #include <deque> #include <string> ...
- 实施erp的建议
纺织行业实施ERP建议 (一)企业各层面应提高对ERP的认识 ERP项目的实施范围横跨企业的每一个部门,在实施过程中需要调动各个部门的资源,这首先需要企业领导者高度重视,从实施的各个环节给予支持:其次 ...