Напишите программу, которая для заданного массива A = {a1, a2, . . . , an} находит количество
пар (i, j) таких, что i < j и a[i] > a[j] .
элементов массива. Вторая строка содержит n попарно различных элементов массива A.
Написал решение, используя Merge Sort, но на 17 тесте получаю WA.
пар (i, j) таких, что i < j и a[i] > a[j] .
Формат входных данныхПервая строка входного файла содержит натуральное число n (1 <= n <= 50 000) — количество
элементов массива. Вторая строка содержит n попарно различных элементов массива A.
Формат выходных данныхВ выходной файл выведите одно число — ответ на задачу.
Написал решение, используя Merge Sort, но на 17 тесте получаю WA.
:
#include <iostream>
using namespace std;
int ans;
void Merge(pair<int,int> a[],int l, int m, int r)
{
int i = l, j = m+1, q = 0;
pair<int,int> *temp = new pair<int,int>[r-l+1];
while (i<=m && j<=r)
{
if (a[i].second<a[j].second && a[i].first > a[j].first)
{
ans += (m-i+1);
}
if (a[i].first<a[j].first)
{
temp[q++] = {a[i].first,a[i].second};
++i;
}
else
{
temp[q++] = {a[j].first,a[j].second};
++j;
}
}
while(i<=m)
{
temp[q++] = {a[i].first,a[i].second};
++i;
}
while(j<=r)
{
temp[q++] = {a[j].first,a[j].second};
++j;
}
for (int q=0;q<r-l+1;++q){
a[l+q] = {temp[q].first,temp[q].second};
}
delete[] temp;
}
void MergeSort(pair<int,int> a[],int l,int r)
{
if (l==r) return;
int m = (l+r)/2;
MergeSort(a,l,m);
MergeSort(a,m+1,r);
Merge(a,l,m,r);
}
int main()
{
int n; cin >> n;
pair<int,int> a[n];
for (int i=0;i<n;++i)
{
int x; cin >> x;
a[i] = {x,i};
}
MergeSort(a,0,n);
cout << ans;
}