45pts为什么过不了呢?QAQ
查看原帖
45pts为什么过不了呢?QAQ
549521
boy♂Next♂dooor楼主2024/3/17 15:35

对于那个更新左右的操作,我将题解的那部分复制上去好像也没过......

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100001;
int n,k;
ll ans;
ll d[N],l[N],r[N];
typedef pair<ll,int> pi;
priority_queue<pi,vector<pi>,greater<pi> > q;
bool rm[N];
int main()
{   
    cin>>n>>k;
    int ii=0,temp=0;
    cin>>temp;
    int s;
    while(cin>>s)
    {
        d[++ii]=s-temp;
        temp=s;
    }
    d[0]=d[n]=0;
    //for(int i=1;i<=n-1;i++) cout<<d[i]<<" ";
    //cout<<endl;
    for(int i=1;i<=n-1;i++)
    {
        q.push({d[i],i});
        l[i]=i-1;//d[i-1];
        r[i]=i+1;//d[i+1];
    }
    for(int i=1;i<=k;i++)
    {
        while(rm[q.top().second]) q.pop();
        auto t=q.top();
        ll di=t.first;
        int p=t.second;
        ans+=di;
        q.pop();
        rm[l[p]]=1;rm[r[p]]=1;
        d[p]=d[l[p]]+d[r[p]]-di;
        r[p]=r[r[p]];
        l[p]=l[l[p]];
        l[r[p]]=r[l[p]]=p;
        //r[l[l[p]]]=r[r[p]];
        //l[r[r[p]]]=l[l[p]];
        
        //if(l[p]>=1) l[p]//-=1;
        //else l[p]=0;
       // r[p]+=1;
        //l[p]=l[p-1];r[p]=r[p+1];
        q.push({/*-di+l[p]+r[p]*/d[p],p});
    }
    cout<<ans;
    return 0;
}

2024/3/17 15:35
加载中...