码迷,mamicode.com
首页 > 其他好文 > 详细

2018 Multi-University Training Contest 2

时间:2018-08-17 13:50:59      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:class   while   cin   div   交换   arc   end   使用   ble   

题目链接:2018 Multi-University Training Contest 1

6318 Swaps and Inversions

题意:sum=x*逆序个数+交换次数*y,使sum最小

思路:反复观察发现,如果有逆序对,那么就一定有相邻的逆序对,而且交换他们一定是合理的

进一步发现,逆序对的数量即是最大交换的次数,最后,ans=min(x,y)*逆序个数

使用分治排序求逆序对个数:

#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
const int maxn=1e5+10;
long long ans;
int num[maxn],num2[maxn];

void ins(int bg,int md,int ed)
{
    int a=bg,b=md+1;
    int now=bg;
    while(a<=md&&b<=ed)
    {
        if(num[a]<=num[b])num2[now]=num[a],a++;
        else num2[now]=num[b],b++,ans+=(md-a+1);
        now++;
    }
    while(a<=md)num2[now++]=num[a++];
    while(b<=ed)num2[now++]=num[b++];
    for(int i=bg;i<=ed;i++)num[i]=num2[i];
}

void mysort(int bg,int ed)
{
    if(bg==ed)return;
    int md=(bg+ed)/2;
    mysort(bg,md);
    mysort(md+1,ed);
    ins(bg,md,ed);
}

int main()
{
    int n,a,b;
    while(cin>>n>>a>>b)
    {
        ans=0;
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        mysort(1,n);
        cout<<ans*min(a,b)<<endl;
    }
    return 0;
}

  

2018 Multi-University Training Contest 2

标签:class   while   cin   div   交换   arc   end   使用   ble   

原文地址:https://www.cnblogs.com/carcar/p/9492686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!