求调 pts96 WA一个点 堆+链表贪心思路
查看原帖
求调 pts96 WA一个点 堆+链表贪心思路
566363
GY程袁浩楼主2024/6/15 14:24
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N];
int l[N],r[N];
int b[N];
int n,m;
void delete_node(int x) {
    r[l[x]]=r[x],l[r[x]]=l[x];
}
void init() {
    int top=0;
    for(int i=1;i<=n;i++) {
        if(a[i]==0) continue;
        if(!top||b[top]*a[i]<0) b[++top]=a[i];
        else b[top]+=a[i];
    }n=top;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    init();int cnt=0,sum=0,k;
    for(int i=1;i<=n;i++) if(b[i]>0) cnt++,sum+=b[i];
    if(m>=cnt) {
        cout<<sum;
        return 0;
    }
    k=cnt-m;set<pair<int,int> > S;
    for(int i=1;i<=n;i++) {
        l[i]=i-1,r[i]=i+1;
        if((i==1||i==n)&&b[i]<0) b[i]=1e18;
        else {
            S.insert({abs(b[i]),i});
            b[i]=abs(b[i]);
        }
    }int res=0;
    b[0]=b[n+1]=1e15;
    while(k--) {
        auto iter=S.begin();
        int one=iter->first,two=iter->second;
        int left=l[two],right=r[two];
        
        res+=one;
        
        S.erase(iter),S.erase({b[left],left}),S.erase({b[right],right});
        b[two]=b[left]+b[right]-one;
        S.insert({b[two],two});
        delete_node(left),delete_node(right);
        
    }
    cout<<sum-res;
    return 0;
}

2024/6/15 14:24
加载中...