【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2015-10-10 19:47
453 查看
2288: 【POJ Challenge】生日礼物
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111
[Submit][Status][Discuss]
Description
ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物。自然地,ftiasch想要知道选择元素之和的最大值。你能帮助她吗?
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define maxn 100001 inline int in() { int x=0,f=1;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return f*x; } struct node{ int x,c,ac; bool operator<(const node &A)const{ return ac>A.ac; } }; using namespace std; priority_queue<node>q; int n,k,a[maxn*5],sum=0,pre[maxn*5],next[maxn*5],nowa[maxn*5],tot=0,ss=0; bool vis[maxn*5]; void solve() { int size=tot+1; for(int i=1;i<=tot;i++)q.push((node){i,nowa[i],fabs(nowa[i])}); for(int i=1;i<=ss;i++) { node Top=q.top();q.pop(); while(vis[Top.x])Top=q.top(),q.pop(); if(!pre[Top.x]) { if(Top.c<0){i--;} else{sum-=Top.ac;} vis[Top.x]=1; pre[next[Top.x]]=0; continue; } else if(next[Top.x]==tot+1) { if(Top.c<0){i--;} else{sum-=Top.ac;} vis[Top.x]=1; next[pre[Top.x]]=tot+1; continue; } node New; sum-=Top.ac; New.c=nowa[pre[Top.x]]+nowa[next[Top.x]]+Top.c; New.x=++size; nowa[size]=New.c; next[New.x]=next[next[Top.x]],pre[next[New.x]]=New.x; pre[New.x]=pre[pre[Top.x]],next[pre[New.x]]=New.x; vis[Top.x]=vis[pre[Top.x]]=vis[next[Top.x]]=1; New.ac=fabs(New.c); q.push(New); } } void Pre() { tot=1; for(int i=1;i<=n;i++) { if(!a[i])continue; else if(!nowa[tot])nowa[tot]=a[i]; else{ if(nowa[tot]>0&&a[i]>0)nowa[tot]+=a[i]; else if(nowa[tot]<0&&a[i]<0)nowa[tot]+=a[i]; else nowa[++tot]=a[i]; } } for(int i=1;i<=tot;i++)next[i]=i+1,pre[i]=i-1; next[0]=1,pre[tot+1]=tot; } int main() { n=in();k=in(); for(int i=1;i<=n;i++)a[i]=in(); Pre(); for(int i=1;i<=tot;i++)if(nowa[i]>0)ss++,sum+=nowa[i]; if(ss<=k){printf("%d",sum);return 0;} ss-=k; solve(); printf("%d",sum); return 0; }
View Code
相关文章推荐
- HDU 5044 Tree 树链剖分
- 10.10做题——USACO1.2/洛谷1207双重回文数(Dual Palindromes)
- [leetcode]Palindrome Linked List
- 静态页面和动态页面
- POJ 2318 TOYS 计算几何 线段相交
- python 获取日期
- 将博客搬至CSDN
- 抽象类与接口
- DialogFragment 创建对话框
- 单元测试、集成测试与系统测试要点
- Linux网络编程---ICMP协议分析及ping程序实现
- get()方法与set()方法
- POJ 2689 筛法求素数
- Why do we make statistics so hard for our students?
- windows命令行 批量对源代码添加版权头/头信息
- 【互联网面试】朋友圈问题
- CodeForcesGym 100517I IQ Test
- Codevs P1018 单词接龙
- 软件测试的分类(上)
- Unity Text 插入图片