题目描述

n个数字,求不相交的总和最大的最多k个连续子序列。
 1<= k<= N<= 1000000。

输入

输出

样例输入

5 2
7 -3 4 -9 5

样例输出

13
 
根据贪心的思想可以知道对于一段连续的正数或负数一定是一起选或者一起不选,那么我们可以将原序列连续的正数或负数缩成一个数,并将中间的$0$及两端的负数去掉,这样序列就变成了正负正负……负正的形式。先贪心地将所有正数选取,如果正数个数$\le k$直接输出正数和就是最优方案,否则我们需要去掉一些正数或选取一些两个正数之间的负数。可以发现无论是去掉正数还是选取负数,答案减少的量都是这个数的绝对值。而根据贪心的原则,如果去掉一个正数一定不会再选取相邻的两个负数,同样选取一个负数一定不会去掉相邻的两个正数。假设序列有$m$个正数,那么问题就变成了给出一个序列(每个数权值为之前的正负序列对应数的绝对值),选出$m-k$个数且不能选取相邻的数使选取数的总和最小,做法和BZOJ1150相同:维护所有数的小根堆,每次取出堆顶$b$计入答案并将与堆顶相邻的两个数$a,c$删除,将权值为$a+c-b$的一个新数插入到原来堆顶的位置。最后用双向链表维护相邻关系。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define pr pair<ll,int>
using namespace std;
ll s[1000010];
int pre[1000010];
int suf[1000010];
int vis[1000010];
int tot;
int n,k;
ll ans,x;
priority_queue< pr,vector<pr>,greater<pr> >q;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
if(x>0)
{
ans+=x;
if(s[tot]>0)
{
s[tot]+=x;
}
else
{
s[++tot]=x;
}
}
if(x<0)
{
if(s[tot]<=0)
{
s[tot]+=x;
}
else
{
s[++tot]=x;
}
}
}
if(s[tot]<=0)
{
tot--;
}
n=tot;
if((n+1)/2<=k)
{
printf("%lld",ans);
return 0;
}
k=(n+1)/2-k;
for(int i=1;i<=n;i++)
{
pre[i]=i-1;
suf[i]=i+1;
s[i]=abs(s[i]);
q.push(make_pair(s[i],i));
}
suf[n]=0;
while(k--)
{
while(vis[q.top().second])q.pop();
ans-=q.top().first;
int now=q.top().second;
q.pop();
vis[pre[now]]=vis[suf[now]]=1;
if(pre[now]&&suf[now])
{
s[now]=s[pre[now]]+s[suf[now]]-s[now];
q.push(make_pair(s[now],now));
pre[now]=pre[pre[now]];
suf[now]=suf[suf[now]];
if(pre[now])
{
suf[pre[now]]=now;
}
if(suf[now])
{
pre[suf[now]]=now;
}
}
else
{
vis[now]=1;
pre[now]=pre[pre[now]];
suf[now]=suf[suf[now]];
if(pre[now])
{
suf[pre[now]]=suf[now];
}
if(suf[now])
{
pre[suf[now]]=pre[now];
}
}
}
printf("%lld",ans);
} 

BZOJ3502PA2012Tanie linie&BZOJ2288[POJ Challenge]生日礼物——模拟费用流+链表+堆的更多相关文章

  1. 【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  2. BZOJ2151种树——模拟费用流+链表+堆

    题目描述 A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这 ...

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

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

  4. 【BZOJ3502/2288】PA2012 Tanie linie/【POJ Challenge】生日礼物 堆+链表(模拟费用流)

    [BZOJ3502]PA2012 Tanie linie Description n个数字,求不相交的总和最大的最多k个连续子序列. 1<= k<= N<= 1000000. Sam ...

  5. 贪心(模拟费用流):NOIP2011 观光公交

    [问题描述] 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2. ...

  6. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  7. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  8. BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP

    题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...

  9. 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流

    昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...

随机推荐

  1. React-菜鸟学习笔记(一)

    新公司的项目前端架构用的是react.js 之前孤陋寡闻并没听说过,想着后期开发和维护多少要会点前端的东西,就简单研究一下.个人的学习习惯能写代码的就不写文字,必要的地方加两行注释,代码一行行敲下去, ...

  2. NO NEWS IS GOOD NEWS

    从客户那传来一个噩耗:要求每个表单在保存之后,要在页面上弹一个 “ 保存成功 ” 的对话框. 客户代表志得意满地说这样用户体验更好,略带谴责意味地傲娇道,“你们早该想到的”.呵呵…… 可不是嘛,我刚入 ...

  3. Oracle记录表删除操作简单方法

    最近项目中Oracle库中一个表log_gpackage有数据丢失现象,但因为没有启用归档,所以CDC和Dataguard都无法使用.google一下,最简单的方法,增加触发器处理逻辑: ---创建触 ...

  4. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  5. Python—randonm模块介绍

    random是python产生伪随机数的模块 >>> random.randrange(1,10) #返回1-10之间的一个随机数,不包括10 >>> random ...

  6. Nice Garland CodeForces - 1108C (思维+暴力)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...

  7. semantic-ui 分割线

    分割线即原生html中的<hr>标签.不过semantic-ui中将<hr>美化了一下下. 1.基础分割线 需要注意的是分割线只能使用div标签和p标签,不能使用span标签. ...

  8. 【kindle笔记】之 《浪潮之巅》- 2018-1-

    <浪潮之巅> 这本书推荐自最爱的政治课老师. 政治课老师张巍老师.我会一直记得你的. 以这样的身份来到这个学校,他人的质疑,自己的忐忑,老板的不公.犹犹豫豫谨小慎微地前进. 第一次听到这样 ...

  9. apply和call方法

    真伪数组转换 /* apply和call方法的作用: 专门用于修改方法内部的this 格式: call(对象, 参数1, 参数2, ...); apply(对象, [数组]); */ function ...

  10. day 7-9 IO模型

    一,同步和异步,阻塞和非阻塞 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就 ...