hdu6318 Swaps and Inversions

本文介绍了一种解决特定排序问题的算法,通过计算逆序对数量并利用逆序对存在的特性,确定了在两种操作下达到排序状态的最小代价。使用了BIT树和离散化技巧进行优化。

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

链接

http://acm.hdu.edu.cn/showproblem.php?pid=6318

题解

这是今天自己做出来的第一道题T_T
注意只要逆序对存在,就肯定有相邻的逆序对(反证法),所以每次交换都可以去掉一个逆序对
所以只要交换逆序对更便宜我就一直交换下去直到不存在逆序对,否则我就干脆不交换
假设逆序对有 c n t cnt cnt个,那么答案就是 x × c n t x\times cnt x×cnt y × c n t y\times cnt y×cnt取较小值

代码

#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
typedef long long ll;
struct BIT
{
    ll bit[maxn], n;
    void init(int N){n=N;for(int i=1;i<=n;i++)bit[i]=0;}
    ll lowbit(ll x){return x&(-x);}
    void add(ll pos, ll v)
    {
        for(;pos<=n;pos+=lowbit(pos))bit[pos]+=v;
    }
    ll sum(ll pos)
    {
        ll ans(0);
        for(;pos;pos-=lowbit(pos))ans+=bit[pos];
        return ans;
    }
}bit;
struct Lisan
{
    int tmp[maxn], tot;
    void clear(){tot=0;}
    void insert(int x){tmp[++tot]=x;}
    void run()
    {
        sort(tmp+1,tmp+tot+1);
        tot=unique(tmp+1,tmp+tot+1)-tmp-1;
    }
    void lisan(int *a, int len)
    {
        for(int i=1;i<=len;i++)a[i]=lower_bound(tmp+1,tmp+tot+1,a[i])-tmp;
    }
    int lisan(int x)
    {
        return lower_bound(tmp+1,tmp+tot+1,x)-tmp;
    }
}ls;
int a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    int N, x, y, i;
    while(cin>>N>>x>>y)
    {
        ls.clear();
        for(i=1;i<=N;i++)cin>>a[i], ls.insert(a[i]);
        ls.run();
        ls.lisan(a,N);
        ll cnt=0;
        bit.init(N);
        for(i=1;i<=N;i++)
        {
            bit.add(a[i],+1);
            cnt+=i-bit.sum(a[i]);
        }
        cout<<min(x,y)*cnt<<'\n';
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值