您的位置:首页 > 其它

【链表】BZOJ 2288: 【POJ Challenge】生日礼物

2015-10-10 19:47 453 查看

2288: 【POJ Challenge】生日礼物

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: