#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
int arr[20][10000];
for (int i = 0; i < k; ++i) {
for (int j = 0; j < n; ++j) {
cin >> arr[i][j];
}
}
int otjm = 0;
for (int i = 0; i < k; ++i) {
for (int j = 1; j < n; ++j) {
int count = 0;
for (int m = 0; m < j; ++m) {
if (arr[i][m] > arr[i][j]) {
count++;
}
}
otjm += count;
}
}
cout << otjm;
return 0;
}
(k - 行数最多 20,n - 列数最多 10000)
该程序的本质是,对于每一行中的每个数字,您需要找到左侧大于当前数字的数字数,然后将所有值相加。给出错误“超出最大值的时间限制”。如何优化?示例测试:
5 2
1 5 2 4 3
2 3 1 5 4
输出:7
现在是时候使用合并排序来编写NlogN中的反转计算了。这是一个正常的情况
merge_sort
,但有一个特点:每当第二个数组中的元素“超越”第一个数组中的元素并插入到结果中时,“超越”元素的数量就会在反转计数器中累积。可以证明结果是数组所有元素的反转总次数。另一个可能的解决方案: