Yibentong 1311: [Beispiel 2.5] Reverse Pair suchen, Sortierung zusammenführen

Diese Frage ist nicht schwer, eine Vorlagenfrage. Der Grund, warum ich diese Lösung schreibe, ist, dass es bei der ersten Einreichung keine AC gab. Lao Tzu war sofort verblüfft. Nachdem ich die Daten geduldig analysiert hatte, stellte ich fest, wo meine Fehler waren. Durch das Drama fiel es außerhalb der Grenzen in die Datengrube. Also nimm es auf.

Titel
Titel Link
Ein Pass ABl.: Http://ybt.ssoier.cn:8088/problem_show.php?pid=1311.

ABl.: Http: //47.110.135.197/problem.php? Id = 4134。

 

Analysieren Sie
eine Standardfrage in umgekehrter Reihenfolge.

Paar in umgekehrter Reihenfolge
Sei A eine geordnete Menge mit n Zahlen (n> 1), wobei alle Zahlen unterschiedlich sind. Wenn es eine positive ganze Zahl i, j gibt, so dass 1 ≤ i <j ≤ n und A [i]> A [j], dann wird das geordnete Paar <A [i], A [j] ein inverses Paar von A und genannt Nannte die umgekehrte Bestellnummer.

Zum Beispiel sind die umgekehrten Paare des Arrays (3, 1, 4, 5, 2) (3, 1), (3, 2), (4, 2), (5, 2), insgesamt 4 umgekehrte Paare.

Algorithmusidee Um
die umgekehrte Reihenfolge eines Arrays zu ermitteln, müssen Sie das Array sortieren und die Anzahl der umgekehrten Ordnungen während des Sortiervorgangs aufzeichnen. Auf diese Weise müssen stabile Sortieralgorithmen wie Blasensortierung, Einfügesortierung und Zusammenführungssortierung verwendet werden.

Datenbereichsanalyse
1. Aus dem Titel können wir erkennen, dass der Bereich von n [1, 10 ^ 5] ist, sodass wir wissen, dass alle Sortieralgorithmen mit O (n ^ 2) -Komplexität TLE sein müssen, was Blasensortierung bedeutet Die Einfügesortierung kann nicht nur zum Zusammenführen der Sortierung verwendet werden.

2. Unter der Annahme, dass im schlimmsten Fall alle 10 ^ 5 Daten in umgekehrter Reihenfolge vorliegen, sollte die umgekehrte Reihenfolge sein.

Was bedeuten diese Daten? Wir möchten daran erinnern, dass der maximale Bereich des C ++ - Datentyps unsigned int 4.294.967.295 beträgt, dh unsigned int kann diese Daten nicht aufnehmen. Meine Frau täuscht.

Zusammenführen und Sortieren, um Paare in umgekehrter Reihenfolge zu finden
Dieser Teil ist der Kern der Analyse. Zunächst verwenden wir Beispieldaten zur Veranschaulichung mithilfe der Zusammenführungssortierung. Angenommen, wir haben eine Folge von Zahlen [5 4 2 6 3 1] und verwenden die Zusammenführungssortierung, um zu sehen, wie viele umgekehrte Paare vorhanden sind.

Der erste Schritt: zwei Punkte, wie unten gezeigt. Nummer in umgekehrter Reihenfolge = 0.

Der zweite Schritt: Die vierte Schicht 5 und 4 verschmelzen: i = l = 1; r = 2; Mitte = (l + r) / 2 = 1; j = Mitte + 1 = 2; weil 5> 4, die Anzahl der Paare in umgekehrter Reihenfolge + mid-i + 1 = 1. b Array: [4 5 0 0 0 0], j + 1> r; Ausgang; ein Array [4 5 2 6 3 1]. Wie unten gezeigt.

Der dritte Schritt: Die vierte Schicht 6 und 3 verschmelzen: i = l = 4; r = 5; mid = (l + r) / 2 = 4; j = mid + 1 = 5; weil 6> 3, die Anzahl der Paare umgekehrter Ordnung + mid-i + 1 = 2. b Array: [4 5 0 3 6 0], j + 1> r; Ausgang; ein Array [4 5 2 6 3 1]. Wie unten gezeigt.

Der vierte Schritt: Die dritte Schicht 4,5 und 2 werden zusammengeführt: i = l = 1; r = 3; Mitte = (l + r) / 2 = 2; j = Mitte + 1 = 3; weil 4> 2, die umgekehrte Reihenfolge Für Menge + Mitte i + 1 = 4. b Array: [2 4 5 3 6 0], j + 1> r; Ausgang; ein Array [2 4 5 3 6 1]. Wie unten gezeigt.

Der fünfte Schritt: Die dritte Schicht 3,6 und 1 verschmelzen: i = l = 4; r = 6; mid = (l + r) / 2 = 5; j = mid + 1 = 6; weil 3> 1, umgekehrte Reihenfolge Für Menge + Mitte i + 1 = 6. b Array: [2 4 5 1 3 6], j + 1> r; Ausgang; ein Array [2 4 5 1 3 6]. Wie unten gezeigt.

Schritt 6: Die zweiten Schichten 2,4,5 und 1,3,6 verschmelzen: i = l = 1; r = 6; mid = (l + r) / 2 = 3; j = mid + 1 = 4; Da 2> 1 ist, ist die umgekehrte Reihenfolge + mid-i + 1 = 9. b-Array: [1 2 4 5 3 6], j + 1; entspricht 2 <3, b-Array: [1 2 4 5 3 6], i + 1; entspricht 4> 3, Nummer in umgekehrter Reihenfolge + mid-i + 1 = 11, b Array: [1 2 3 4 5 6]. j + 1; entsprechend 4 <6, b-Array: [1 2 3 4 5 6]; i + 1, 5 <6, b-Array: [1 2 3 4 5 6]; i + 1> mid, exit, a Array [1 2 3 4 5 6], bestellt. Wie unten gezeigt.

Aus der obigen Analyse können wir erkennen, dass das Wichtigste darin besteht, die Zusammenführungssortierung zu verwenden, um das umgekehrte Paar zu finden

ans + = mid-i + 1;

//http://ybt.ssoier.cn:8088/problem_show.php?pid=1311
//求逆序对
#include <bits/stdc++.h>
using namespace std;
 
const int MAXN = 1e6+4;
int nums[MAXN] = {};
int tmps[MAXN];
long long ans = 0;
 
//使用归并排序
void merge(int l, int mid, int r) {
    int i=l;
    int j=mid+1;
    int k=l;
    while (i<=mid && j<=r) {
        if (nums[i]>nums[j]) {
            tmps[k++]=nums[j++];
            ans+=mid-i+1;
        } else {
            tmps[k++]=nums[i++];
        }
    }
 
    while (i<=mid) {
        tmps[k++]=nums[i++];
    }
    while (j<=r) {
        tmps[k++]=nums[j++];
    }
    for (i=l; i<=r; i++) {
        nums[i]=tmps[i];
    }
}
 
void mergeSort(int l, int r) {
    int mid;
    if (l < r) {
        mid = l+((r-l)>>1);
        mergeSort(l, mid);
        mergeSort(mid+1, r);
        merge(l, mid, r);
    }
}
 
int main() {
    int n;
    cin >> n;
    int i;
    for (i=0; i<n; i++) {
        cin >> nums[i];
    }
 
    mergeSort(0, n-1);
 
    cout << ans << endl;
 
    return 0;
}


————————————————
Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des CSDN-Bloggers "The Old Week of Efforts". Befolgen Sie gemäß der Copyright-Vereinbarung von CC 4.0 BY-SA den Original-Quelllink zum Nachdruck Und diese Aussage.
Ursprünglicher Link: https://blog.csdn.net/justidle/article/details/104565227

 

Gepostet 33 Originalartikel · Gefällt mir 0 · Besuche 167

Ich denke du magst

Origin blog.csdn.net/weixin_42790071/article/details/105436355
Empfohlen
Rangfolge