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

来源:互联网 发布:mac如何下载eclipse 编辑:程序博客网 时间:2024/05/16 17:10

思路

#include<cstdio>#include<queue>#include<algorithm>#define ABS(x) (x>0?x:-x)#define N 50000#define LL long longusing 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);}
原创粉丝点击