【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
2288: 【POJ Challenge】生日礼物
Description
ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物。
自然地,ftiasch想要知道选择元素之和的最大值。你能帮助她吗?
Input
第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分。
第2行, N 个整数 A1, A2, ..., AN (0 ≤ |Ai| ≤ 104), 序列。
Output
一个整数,最大的和。
Sample Input
5 2
2 -3 2 -1 2Sample Output
5HINT
Source
【分析】
我好笨啊。。。
首先可以把序列弄的好看点,0删掉,负数一段合并,正数一段合并。
那么就是- + - + - 交替。
假设我们先把所有正段选了。假设选了cnt段。
如果cnt<=m,那么这显然就是答案。
否则,按照他们的绝对值扔进小根堆里面,每次选队顶元素。ans-=他的值。
如果选到正数,表示把这个正数删掉,就少了一段。
如果选到负数,表示把负数两边的两段连起来,也少了一段。
知道这个意思之后就知道两端的负数是不可以选的,因为没有意义。
然后删掉那个数之后和两边的两段合并起来重新扔到堆里面做。。【里面包含后悔操作!!!!思考一下!!!!
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 100100 struct node
{
int id,x;
friend bool operator < (node x,node y)
{
return x.x>y.x;
}
}; priority_queue<node > q; int a[Maxn],w[*Maxn];
int lt[*Maxn],nt[*Maxn];
bool mark[*Maxn]; int myabs(int x) {return x<?-x:x;} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
w[]=a[];
int p=;
for(int i=;i<=n;i++)
{
if(a[i]==) continue;
if((a[i]>=&&w[p]>=)||(a[i]<=&&w[p]<=)) w[p]+=a[i];
else w[++p]=a[i];
}
int cnt=,ans=;
for(int i=;i<=p;i++) if(w[i]>) cnt++,ans+=w[i];
if(cnt>m)
{
m=cnt-m;
memset(mark,,sizeof(mark));
while(!q.empty()) q.pop();
for(int i=;i<=p;i++) nt[i]=i+;nt[p]=-;
for(int i=;i<=p;i++) lt[i]=i-;
for(int i=;i<=p;i++)
{
node xx;
xx.id=i;
xx.x=myabs(w[i]);
q.push(xx);
}
cnt=p;
for(int i=;i<=m;i++)
{
while(mark[q.top().id]) q.pop();
node xx=q.top();q.pop();
if(lt[xx.id]==)
{
lt[nt[xx.id]]=;
if(w[xx.id]<)
{
i--;
continue;
}
ans-=xx.x;
}
else if(nt[xx.id]==-)
{
nt[lt[xx.id]]=-;
if(w[xx.id]<)
{
i--;
continue;
}
ans-=xx.x;
}
else
{
ans-=xx.x;
mark[lt[xx.id]]=mark[nt[xx.id]]=;
cnt++;
nt[lt[lt[xx.id]]]=lt[nt[nt[xx.id]]]=cnt;
lt[cnt]=lt[lt[xx.id]];nt[cnt]=nt[nt[xx.id]];
node nw;
nw.id=cnt;
nw.x=myabs(w[nt[xx.id]]+w[lt[xx.id]]+w[xx.id]);
w[cnt]=w[nt[xx.id]]+w[lt[xx.id]]+w[xx.id];
q.push(nw);
}
}
}
printf("%d\n",ans);
return ;
}
给一个sample in:
5
53 -20 3 -27 68 out:
77
发发表情更健康

2017-01-14 11:01:57
【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)的更多相关文章
- bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1003 Solved: 317[Submit][ ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 https://lydsy.com/JudgeOnline/problem.php?id=2288 分析: 贪心+堆+链表. 首先把序列变一下,把相 ...
- 2288.【POJ Challenge】生日礼物 链表+堆+贪心
BZOJ2288 [POJ Challenge]生日礼物 题意: 给一个长度为\(n\)的数组,最多可以选\(m\)个连续段,问选取的最大值是多少 题解: 先把连续的符号相同的值合并,头和尾的负数去掉 ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )
虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...
- BZOJ 2287 【POJ Challenge】消失之物(DP+容斥)
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 986 Solved: 572[Submit][S ...
- BZOJ 2288 【POJ Challenge】生日礼物(贪心+优先队列)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2288 [题目大意] 给出一列数,求最多取m段连续的数字,使得总和最大 [题解] 首先我 ...
- BZOJ 2288: 【POJ Challenge】生日礼物 贪心 + 堆 + 链表
好像是模拟费用流 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r" ...
随机推荐
- 常见XSD问题
< xs:elementname="status"> < xs:complexType> < xs:sequence> < xs:elem ...
- 大话Spring Cloud
研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...
- [bzoj1070] 修车
这周学习了费用流,就写了几题.其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……). 题目大意:有m个技术人员n辆车,一个技术人员只能同时 ...
- Xmind 8 update5 破解
Step 1. Download XMind Step 2. Run XMind at least once after installation, xmind will init the confi ...
- Shell脚本中引用、调用另一个脚本文件的2种方法
Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm
- 计数排序的实现--适用于元素均较小的seq
今天无聊就打算把所有的排序算法都看一遍... 计数排序的时间复杂度是O(n),在算法导论中,用决策树模型中论证了,比较排序的情况为nlogn的复杂度.而计数排序的时间复杂度小于他的原因就是它不需要进行 ...
- DXEditingRow的错误原因
原因之一:例如commbox理由id这一列但是数据库表中没有的话就会报这个错误
- xtraTabControl学习
winform 首先是动态添加page面,并且在page页面上添加一个form窗体 DevExpress.XtraTab.XtraTabPage page = new DevExpress.XtraT ...
- FineReport——插入行策略
1.空值是默认的选项,即每次插入新行时,格子都是空白的. 2.原值即单元格中原有内容是什么,就复制到新增的格子中,一般适用于单元格是使用公式定义的, 在插入单元格时,公式会保留下来. 3.默认值即通过 ...
- Mybatis插入数据返回自增主键
方法有很多,参考 mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey 这里记录一下工作中自己用到的selectkey方法的详细过程. po ...
