hdu 4911 Inversion(归并)

题目链接:hdu 4911 Inversion

题目大意:给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少。

解题思路:每交换一次一定可以减少一个逆序对,所以问题转换成如何求逆序对数。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;
const int maxn = 1e5+5;

ll k;
int n, s[maxn], t[maxn];

ll merge_sort (int l, int r, int* a, int* b) {

    if (l == r)
        return 0;

    int mid = (l + r) / 2;
    ll ret = merge_sort(l, mid, a, b) + merge_sort(mid+1, r, a, b);
    int mvl = l, mvr = mid+1, mv = l;
    while (mvl <= mid || mvr <= r) {
        if (mvr > r || (mvl <= mid && a[mvl] <= a[mvr])) {
            b[mv++] = a[mvl++];
        } else {
            ret += mid - mvl + 1;
            b[mv++] = a[mvr++];
        }
    }

    for (int i = l; i <= r; i++)
        a[i] = b[i];
    return ret;
}

int main () {
    while (scanf("%d%I64d", &n, &k) == 2) {
        for (int i = 1; i <= n; i++)
            scanf("%d", &s[i]);
        ll ans = merge_sort(1, n, s, t);
        printf("%I64d\n", max(ans - k, 0LL));
    }
    return 0;
}

hdu 4911 Inversion(归并),布布扣,bubuko.com

时间: 2024-09-06 15:18:24

hdu 4911 Inversion(归并)的相关文章

HDU 4911 Inversion(归并求逆序对)

HDU 4911 Inversion 题目链接 题意:给定一个数组,可以相邻交换最多k次,问交换后,逆序对为多少 思路:先利用归并排序求出逆序对,然后再减去k就是答案 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 100005; int n, num[N], save[N], sn; void init() { for

2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后来终于想出来这根本就是求逆序数嘛,可以用归并排序,也可以用树状数组,不过我们用树状数组做错了,也不知道为什么.求出逆序数来再减掉k次,就可以求出最终结果来了.求逆序数链接1,链接2 1 #include <stdio.h> 2 3 int left[250003], right[250003];

HDU 4911 Inversion 求逆序数对

点击打开链接 Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1106    Accepted Submission(s): 474 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent num

hdu 4911 Inversion

Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 197    Accepted Submission(s): 82 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers for

hdu 4911 Inversion(归并排序求逆序对数)

Inversion                                                                             Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two 

hdu 4911 Inversion(求逆序数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 528    Accepted Submission(s): 228 Problem Description bobo has a sequence a1,a2,

HDU 4911 Inversion(归并排序求逆序数)

归并排序求逆序数,然后ans-k与0取一个最大值就可以了. 也可以用树状数组做,比赛的时候可能姿势不对,树状数组wa了.. Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 578    Accepted Submission(s): 249 Problem Description bobo has a seque

HDU 4911 Inversion(基本算法-排序)

Inversion Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers for no more than k times. Find the minimum number of inversions after his swaps. Note: The number of inversions is the number of pair (i,j) where

hdu - 4911 - Inversion(离散化+树状数组)

题意:一个由n个非负整数组成的序列,问进行最多k次相邻交换后最少的逆序对数 (1 ≤ n ≤ 10^5, 0 ≤ k ≤ 10^9, 0 ≤ ai ≤ 10^9).. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 -->>每次只能交换相邻的两个数,每次交换,只改变这两个数的逆序,其他的数对于这两个数的逆序没有改变,所以,求出所有的逆序对,再减去k就是答案. #include <cstdio> #include <cst