题目
代码
#include <cstdlib>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <stdio.h>
#include <numeric>
#include <algorithm>
#include <functional>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <memory>
#include <memory.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
typedef unsigned char uchar;
// #define G_DEBUG
// 定义unordered_set<pair<int,int>, pairhash> sets时会用到
struct pairhash {
public:
template <typename T, typename U>
std::size_t operator()(const std::pair<T, U> &x) const
{
return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
}
};
void merge(vector<int>& count, vector<pair<int, int>>& nums, int start, int mid, int end)
{
int left = start, right = mid + 1;
vector<pair<int, int>> helper(end - start + 1);
int idx = 0;
while (left <= mid && right <= end)
{
if (nums[left].first > nums[right].first)
{
count[nums[left].second] += (end - right + 1);
helper[idx++] = nums[left++];
}
else
helper[idx++] = nums[right++];
}
while (left <= mid)
helper[idx++] = nums[left++];
while (right <= end)
helper[idx++] = nums[right++];
copy(helper.begin(), helper.end(), nums.begin() + start);
}
void merge_sort(vector<int>& count, vector<pair<int,int>>& nums, int start, int end)
{
if (start >= end)
return;
int mid = (start + end) / 2;
merge_sort(count, nums, start, mid);
merge_sort(count, nums, mid + 1, end);
merge( count, nums, start, mid, end );
}
int main()
{
#ifdef G_DEBUG
// 调试使用
ifstream file("data.txt");
int N = 0;
file >> N;
vector<int> nums(N);
for (int i = 0; i < N; i++)
{
file >> nums[i];
}
file.close();
#else
int N = 0;
cin >> N;
vector<int> nums(N, 0);
for (int i = 0; i < N; i++)
{
cin >> nums[i];
}
#endif
vector<pair<int, int>> pairs( N );
for (int i = 0; i < N; i++)
{
pairs[i].first = nums[i];
pairs[i].second = i;
}
vector<int> count_left(N, 0);
merge_sort( count_left, pairs, 0, N-1 );
vector<int> count_right(N, 0);
for (int i = 0; i < N; i++)
{
pairs[i].first = -nums[N - 1 - i];
pairs[i].second = N - 1 - i;
}
merge_sort(count_right, pairs, 0, N - 1);
int before = 0;
int min_idx = 0;
int min_val = 0;
for (int i = 0; i < N; i++)
min_val += count_left[i];
before = min_val;
for (int i = 0; i < N; i++)
{
if (before + i - count_left[i] - count_right[i] < min_val)
{
min_val = before + i - count_left[i] - count_right[i];
min_idx = i;
}
}
cout << min_val << " " << (min_idx + 1) << endl;
system("pause");
return 0;
}