您的位置:首页 > 其它

51nod 1053 最大M子段和 V2[贪心][链表][堆]

2017-10-08 21:29 330 查看
思路

#include<cstdio>
#include<queue>
#include<algorithm>
#define ABS(x) (x>0?x:-x)
#define N 50000
#define LL long long
using namespace std;

int n,m,l[N+5],r[N+5];
LL v[N+5];
struct node
{
int p;
bool operator < (const node &x) const
{
return ABS(v[p])>ABS(v[x.p]);
}
};

priority_queue<node>heap;

int main()
{
scanf("%d %d",&n,&m);
int cnt=0,now=0;
LL ans=0,x,V=0;
for(int i=1;i<=n;++i)
{
scanf("%lld",&x);
if(x==0) continue;
if(V==0) {V=x;continue;}
if(x>0)
{if(V>0) V+=x;else v[++cnt]=V,V=x;}
if(x<0)
{if(V<0) V+=x;else v[++cnt]=V,V=x;}
}
v[++cnt]=V;
for(int i=1;i<=cnt;++i)
{
if(v[i]>0) ++now,ans+=v[i];
l[i]=i-1,r[i]=i+1;heap.push((node){i});
}
l[0]=0,r[0]=1,l[cnt+1]=cnt,r[cnt+1]=cnt+1;
int tmp,L,R;
while(now>m)
{
tmp=heap.top().p;heap.pop();
if(l[r[tmp]]!=tmp||r[l[tmp]]!=tmp) continue;
if(!v[tmp]||(v[tmp]<0&&(l[tmp]<1||r[tmp]>cnt))) continue;
ans-=ABS(v[tmp]),--now;
v[tmp]=v[tmp]+v[l[tmp]]+v[r[tmp]];
L=l[l[tmp]],R=r[r[tmp]];
l[tmp]=L,r[tmp]=R,r[L]=tmp,l[R]=tmp;
heap.push((node){tmp});
}
printf("%lld",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: