BZOJ5059 前鬼后鬼的守护

本文介绍了一个算法问题:如何以最小代价将一个整数序列调整为单调非降序列。通过使用集合数据结构,该算法能够在O(n log n)的时间复杂度内解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前鬼后鬼的守护

给一个长度为n的正整数序列a,每次你可以花|ai-a′i|的代价把
ai修改成a′i,要求用最小的代价把数列修改成单调非降的(即
ai≤ai+1)。n≤5*10^5;ai≤10^9。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <cmath>
#define File(x) "test."#x
#define For(i,s,e) for(int i=(s); i<=(e); i++)
#define Rep(i,s,e) for(int i=(s); i>=(e); i--)
using namespace std;

const int N=500000+3,Mod=20170408;

int n,x;
long long ans;

multiset<int,greater<int> > Set;

int main()
{
    freopen(File(in),"r",stdin);
    freopen(File(out),"w",stdout);

//  ios::sync_with_stdio(false);

    scanf("%d",&n);
    For(i,1,n){
        scanf("%d",&x);
        Set.insert(x);
        if(x<*Set.begin()){
            ans+=abs(*Set.begin()-x);
            Set.erase(Set.begin());
            Set.insert(x);
        }
    }
    cout<<ans<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值