HDU 4911 Inversion【归并排序||线段树】

来源:互联网 发布:天猫和淘宝的盈利模式 编辑:程序博客网 时间:2024/05/18 18:15

Inversion
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 5254 Accepted Submission(s): 1849

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) where1i<jnand ai>aj.

Input

The input consists of several tests. For each tests:

The first line contains 2 integers n,k (1≤n≤105,0≤k≤109). The second line contains n integers a1,a2,…,an (0≤ai≤109).

Output

For each tests:

A single integer denotes the minimum number of inversions.

Sample Input

3 1
2 2 1
3 0
2 2 1

Sample Output

1
2

Author

Xiaoxu Guo (ftiasch)

Source

2014 Multi-University Training Contest 5

Recommend

We have carefully selected several similar problems for you: 6242 6241 6240 6239 6238

题意:求逆序数-K和0比较。

算是吃了清题慢的亏了,杭电新生赛也遇到了求逆序数的题,悔死!

归并排序:

#include<iostream>#include<cstring>#include<iomanip>#include<cstdio>#include<algorithm>using namespace std;#define ll long long intconst int maxn = 1e5 + 10;int s[maxn], A[maxn];int n, k;ll sum;void merge(int L, int R){    int mid = (L + R) / 2;    int i = 0, j = 0, k = 0;    for (i = L, j = mid; i < mid&&j < R;)    {        if (s[j] < s[i])        {            sum += mid - i;            A[k++] = s[j];            j++;        }        else        {            A[k++] = s[i];            i++;        }    }    while (i < mid)    {        A[k++] = s[i];        i++;    }    while (j < R)    {        A[k++] = s[j];        j++;    }    memcpy(s + L, A, sizeof(int) * k);}void merge_sort(int L, int R){    if (R - L < 2)        return;    int mid = (L + R) / 2;    merge_sort(L, mid);    merge_sort(mid, R);    merge(L, R);}int main(){    while (~scanf("%d%d", &n, &k))    {        for (int i = 0; i < n; i++)        {            scanf("%d", &s[i]);        }        sum = 0;        merge_sort(0, n);        printf("%lld\n", max(1ll * 0, sum - k));    }    return 0;}
阅读全文
0 0