Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 514808

В матрице найти количество пар (i, j) таких, что i < j и a[i] > a[j] - С++ для начинающих

$
0
0
Напишите программу, которая для заданного массива A = {a1, a2, . . . , an} находит количество
пар (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;
}


Viewing all articles
Browse latest Browse all 514808

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>