B - Improve Inversions :
题目大意:
思路解析:
假设现在出现了这样的情况 ......6 ......... 4 3 2 1,可以发现最好的交换方式为 6 和 4交换,然后4 3交换,然后3和2交换,然后2和1交换得到 ......1 ......... 6 4 3 2,那我们考虑6还有没有可能和4 3 2进行交换。我们可想到如果他能和 4 3 2进行交换那么最好方案会变为 2 6 4 3.那么我们可以想到其实在最初情况下 4可以和 3 2 1进行交换,得到 假设现在出现了这样的情况 ......6 ......... 1 4 3 2,可以发现无论是4还是6先交换最优情况都是相同的,那么我应该从1 到 n开始考虑它能进行的最优交换。
代码实现:
#include <bits/stdc++.h>
using i64 = long long;
struct node
{
int l, r;
};
void solve() {
int n, k;
std::cin >> n >> k;
std::vector<int> p(n+1), id(n+1);
for(int i = 1; i <= n; i++){
std::cin >> p[i];
id[p[i]] = i;
}
std::vector<node> ans;
for(int i = 1; i <= n; i++){
int v = id[i];
std::vector<int> t;
for(int j = v + k; j <= n;j++){
if (p[j] < i) t.push_back(p[j]);
}
std::sort(t.begin(), t.end());
for(int i = t.size() - 1; i >= 0; i--){
int x = id[t[i]];
ans.push_back({v, x});
std::swap(id[p[v]], id[p[x]]);
std::swap(p[v], p[x]);
}
}
std::cout << ans.size() << "\n";
for(int i = 0; i < ans.size(); i++){
std::cout << ans[i].l << " " << ans[i].r << "\n";
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t = 1;
//std::cin >> t;
while (t--) {
solve();
}
return 0;
}