1 条题解

  • 0
    @ 2021-8-7 20:49:57

    C++ :

    #include <iostream>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long LL;
    typedef pair<LL,int> PLI;
    const int N=1e5+5;
    
    int n,k;
    int l[N],r[N];
    LL d[N];
    
    void delete_node(int x){
    	r[l[x]]=r[x];
    	l[r[x]]=l[x];
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin>>n>>k;
    	for(int i=0;i<n;i++) cin>>d[i];
    	for(int i=n-1;i;i--) d[i]-=d[i-1];
    	
    	set<PLI> s;
    	d[0] = d[n] = 1e15;
    	for(int i=0;i<=n;i++) {
    		s.insert({d[i],i});
    		l[i]=i-1;
    		r[i]=i+1;
    	}
    	
    	LL ans=0;
    	while(k--){
    		auto x=s.begin();
    		LL v=x->first;
    		int p=x->second,left=l[p],right=r[p];
    		
    		ans+=v;
    		
    		s.erase(x);
    		s.erase({d[left],left});
    		s.erase({d[right],right});
    		delete_node(left);
    		delete_node(right);
    		
    		d[p]=d[left]+d[right]-d[p];
    		s.insert({d[p],p});
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    58
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    45
    已通过
    38
    上传者