timus[1090. In the Army Now]

Posted knull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了timus[1090. In the Army Now]相关的知识,希望对你有一定的参考价值。

timus[1090. In the Army Now]

看了一下题目的意思,求逆序数,求出逆序数最大的行号。

求逆序数是经典问题,想起当年刚学编程时,算法导论里就有这个习题,如何将merge sort修改为可以计算逆序数的版本,于是写了一下,得到了以下一份答案。

技术分享图片
 1 #include <iostream>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 const int MAX_N = 10000;
 7 
 8 const int INF = MAX_N + 1;
 9 
10 int N, K;
11 
12 int A[MAX_N];
13 
14 int aux[2][(MAX_N >> 1) + 1];
15 
16 int merge(int p, int mid, int q)
17 {
18 
19     int left_length = mid + 1 - p;
20     int right_length = q - mid;
21     for (int i = 0; i < left_length; ++i)
22     {
23         aux[0][i] = A[p + i];
24     }
25     aux[0][left_length] = INF;
26 
27     for (int i = 0; i < right_length; ++i)
28     {
29         aux[1][i] = A[mid + 1 + i];
30     }
31     aux[1][right_length] = INF;
32     int ans = 0;
33     int i = 0;
34     int j = 0;
35     for (int k = 0; k < left_length + right_length; ++k)
36     {
37         if (aux[0][i] < aux[1][j])
38         {
39             A[p + k] = aux[0][i++];
40         }
41         else
42         {
43             A[p + k] = aux[1][j++];
44             ans += left_length - i;
45         }
46     }
47     return ans;
48 }
49 
50 int inversions(int p, int q)
51 {
52     int ans = 0;
53     if (p < q)
54     {
55         int mid = (p + q) / 2;
56         ans += inversions(p, mid);
57         ans += inversions(mid + 1, q);
58         ans += merge(p, mid, q);
59     }
60     return ans;
61 }
62 
63 int main()
64 {
65     cin >> N >> K;
66     int ans;
67     int max_inversions = -1;
68     for (int k = 0; k < K; ++k)
69     {
70         for (int i = 0; i < N; ++i)
71         {
72             cin >> A[i];
73         }
74         int x = inversions(0, N - 1);
75         if (x > max_inversions)
76         {
77             max_inversions = x;
78             ans = k + 1;
79         }
80     }
81     cout << ans << endl;
82 
83     return 0;
84 }
Solution with merge sort.

 

以上是关于timus[1090. In the Army Now]的主要内容,如果未能解决你的问题,请参考以下文章

F. Bakkar In The Army 二分

cf 588E Duff in the Army 树上倍增

XSY2414CF587CDuff in the Army(倍增lca)

Codeforces Round #326 (Div. 1) C - Duff in the Army

HackerRank training-the-army

codeforces#1090 D. New Year and the Permutation Concatenation(打表找规律)