本题是数据备份的进阶版。

首先去掉所有0,把连续的正数/负数连起来。

计算所有正数段的个数与总和。

然后考虑数据备份,有一点区别:

如果我们在数列中选出一个负数,相当于把它左右连起来。

选出一个正数,相当于抛弃它。

总和加上那个负数/减去那个正数即为变化。

所以把val按照绝对值进堆,出来,减去绝对值即可。

注意:两边的负数不能选,因为旁边没有东西去给你连。

实际操作的时候我存了负数,在比较函数里加abs

 #include <cstdio>
#include <queue>
#include <cmath>
const int N = ; struct Sta {
int p, val;
Sta(int pq, int v) {
p = pq;
val = v;
}
};
inline int abs(const int &x) {
return x > ? x : -x;
}
inline bool operator <(const Sta &x, const Sta &y) {
return abs(x.val) > abs(y.val);
}
struct ListNode {
int pre, nex, val;
bool use;
}li[N << ]; int top, head, tail; int a[N], ans, cnt;
std::priority_queue<Sta> Q; inline void init() {
head = (N << ) - ;
tail = head - ;
li[head].nex = tail;
li[tail].pre = head;
return;
} inline void add(int x) {
top++;
int p = li[tail].pre;
li[top].pre = p;
li[top].nex = tail;
li[p].nex = top;
li[tail].pre = top;
li[top].val = x;
Q.push(Sta(top, x));
if(x > ) {
ans += x;
cnt++;
}
return;
} inline int get() {
Sta t = Q.top();
Q.pop();
while(!Q.empty() && (li[t.p].use || li[t.p].val != t.val)) {
t = Q.top();
Q.pop();
}
int x = t.p; if(li[x].val < && li[x].pre == head) {
li[x].use = ;
li[li[x].nex].pre = head;
li[head].nex = li[x].nex;
return get();
}
if(li[x].val < && li[x].nex == tail) {
li[x].use = ;
li[tail].pre = li[x].pre;
li[li[x].pre].nex = tail;
return get();
} if(li[x].nex == tail && li[x].pre == head) {
li[x].use = ;
return li[x].val;
}
if(li[x].nex == tail) {
int ans = li[x].val;
li[x].val += li[li[x].pre].val;
li[li[x].pre].use = ;
li[x].pre = li[li[x].pre].pre;
li[li[x].pre].nex = x;
Q.push(Sta(x, li[x].val));
return ans;
}
if(li[x].pre == head) {
int ans = li[x].val;
li[x].val += li[li[x].nex].val;
li[li[x].nex].use = ;
li[x].nex = li[li[x].nex].nex;
li[li[x].nex].pre = x;
Q.push(Sta(x, li[x].val));
return ans;
}
int ans = li[x].val;
li[x].val += li[li[x].nex].val;
li[x].val += li[li[x].pre].val;
li[li[x].pre].use = ;
li[li[x].nex].use = ;
li[x].pre = li[li[x].pre].pre;
li[x].nex = li[li[x].nex].nex;
li[li[x].pre].nex = x;
li[li[x].nex].pre = x;
Q.push(Sta(x, li[x].val));
return ans;
} int main() {
int m, n;
init();
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
int t = ;
bool f = ;
for(int i = ; i <= n; i++) {
if(!a[i]) {
continue;
}
if(f) {
if(a[i] < ) {
continue;
}
else {
f = ;
}
}
if(1ll * a[i] * t >= ) {
t += a[i];
}
else {
add(t);
t = a[i];
}
}
if(t > ) {
add(t);
} for(int i = m + ; i <= cnt; i++) {
ans -= abs(get());
}
printf("%d", ans);
return ;
}

AC代码

BZOJ2288 生日礼物的更多相关文章

  1. bzoj2288 生日礼物 (线段树)

    我当然想选最大的子段和啦 但要选M次 那不一定就是最好的 所以提供一个反悔的选项,我选了一段以后,就把它们乘个-1,然后再选最好的(类似于网络流的思路) 这个可以用线段树来维护,记一个区间包含左端点/ ...

  2. 2018.09.30 bzoj2288:生日礼物(贪心+线段树)

    传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ...

  3. 我的刷题单(8/37)(dalao珂来享受切题的快感

    P2324 [SCOI2005]骑士精神 CF724B Batch Sort CF460C Present CF482A Diverse Permutation CF425A Sereja and S ...

  4. bzoj2288【POJ Challenge】生日礼物*

    bzoj2288[POJ Challenge]生日礼物 题意: 给一个序列,求不超过m个连续的部分,使元素和最大.序列大小≤100000 题解: 先把连续的正数和负数合并起来,接着如果正数个数小于m则 ...

  5. BZOJ2288: 【POJ Challenge】生日礼物

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

  6. [bzoj2288][pojChallenge]生日礼物【贪心+堆+链表】

    题目描述 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, -, AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知 ...

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

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

  8. 【BZOJ2288】生日礼物 [贪心]

    生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ftiasch 18岁生日的时候, ...

  9. BZOJ2288 【POJ Challenge】生日礼物 【堆 + 链表】

    题目 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知 ...

随机推荐

  1. Oracle调优总结

    Oracle调优总结(经典实践 重要) https://blog.csdn.net/dtjiawenwang88/article/details/74892245 https://www.cnblog ...

  2. 关于手机端适配的问题(rem,页面缩放)

    关于手机端适配的问题(rem,页面缩放) 96 进击的小前端 关注 2018.02.02 13:57 字数 320 阅读 19评论 0喜欢 0 相信很多和会和我碰到一样的情况,就是你用rem去写移动端 ...

  3. php5.6.x到php7.0.x特性

    php5.6.x到php7.0.x特性 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array,self,Clas ...

  4. python爬虫之scrapy安装(一)

    简介: Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrap ...

  5. playframework 编译打包过程失败

    root@mytest:/data# play war p2p-master --exclude tmp:logs:test:eclipse -o /data/a/sp2p~ _ _ ~ _ __ | ...

  6. iview render bug & vue namespace bug

    iview render bug https://codepen.io/xgqfrms/pen/gyGjKP https://codepen.io/xgqfrms/full/gyGjKP bug &l ...

  7. DAY09、函数

    一.函数的定义:跟变量名的定义大同小异 1.声明函数的关键词:def 2.函数(变量)名:使用函数的依据 3.参数列表:()   参数个数可以为0到n个,但()一定不能丢,完成功能的必要条件 4.函数 ...

  8. python设计模式第十九天【职责链模式】

    1.应用场景 (1)将一个任务拆分为具有顺序的多个部分,每个类完成相应的部分,并且顺序执行 (2)软件窗口的消息传播 (3)SERVLET容积的过滤器Filter的实现 2.代码实现 #!/usr/b ...

  9. flask Django保存session区别

    '''Django中,session保存在服务端的数据库中,数据库中保存请求用户的所有数据,服务端数据中{'随机字符串':加密后的客户相关信息}请求完成后,把随机字符串作为值,返回给客户端,保存在客户 ...

  10. 官网下载旧版本jdk,老版本jdk,jdk1.7,jdk1.8

    1.进入中文oracle官网(不是国内官网下载速度超级慢): http://www.oracle.com/technetwork/cn/indexes/downloads/index.html 2.进 ...