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); }
相关文章推荐
- 【贪心+优先队列】51Nod 1053 最大M子段和 V2
- 51nod 1053 最大M子段和 V2 (链表 对经典dp进行优化)
- 【贪心+堆+链表】51Nod1053[最大M子段和 V2]题解
- 51nod 最大M子段和V2【贪心】【链表】【堆】
- 51nod 1053 最大M子段和 V2
- 51Nod 1052/1053/1115 最大M子段和V1/V2/V3
- 51Nod-1053-最大M子段和 V2
- 51nod 1053 最大M子段和 V2
- 51nod 最大M子段和 V1,V2,V3 dp 贪心 heap(bzoj2288)
- [贪心+堆+链表] 51Nod1053 最大M子段和 V2
- 【dp】51nod 1052 最大M子段和
- 51Nod-1188-最大公约数之和 V2
- 51nod 1254 最大子段和 V2 ——单调栈
- [51nod 1292]字符串中的最大值V2
- 51nod 最大M子段和
- 51Nod-1052-最大M子段和
- 51nod 1254最大子段和V2
- 51nod 1065 最小正子段和 (贪心)
- 51nod 1563 坐标轴上的最大团 (贪心)
- 【51nod】1052 最大M子段和 DP