QOJ.ac

QOJ

حد الوقت: 1 s حد الذاكرة: 256 MB مجموع النقاط: 100

#23832. Kuplalajittelu

الإحصائيات

Tehtävänanto

Kuplalajittelu on yksi lukujonon lajittelualgoritmeista. Oletetaan, että haluamme lajitella pituutta $N$ olevan lukujonon $A$ nousevaan järjestykseen. Kuplalajittelu vaihtaa $2$ vierekkäisen luvun paikkaa, jos niiden suuruusjärjestys on väärä. Yksi läpikäynti koostuu siitä, että lukujono käydään läpi alusta loppuun ja kyseiset $2$ lukua vaihdetaan keskenään aina, kun $A_i > A_{i+1}$, arvoilla $i = 1, 2, \dots, N - 1$ tässä järjestyksessä. Tiedetään, että toistamalla tämä läpikäynti $N - 1$ kertaa lukujono saadaan lajiteltua nousevaan järjestykseen.

Lukujonon $A$ kuplalajittelun vaihtojen lukumäärä tarkoittaa sitä, kuinka monta kertaa kokonaislukujen paikkoja vaihdetaan, kun yllä olevaa algoritmia sovelletaan lukujonoon $A$. (Vaikka kuplalajitteluna tunnetuissa algoritmeissa ja toteutuksissa voi olla pieniä eroja silmukoiden järjestyksessä, rajoissa ja lopetusehdoissa, tiedetään, että kokonaislukujen vaihtojen lukumäärä samaan lukujonoon sovellettuna ei muutu näiden erojen vuoksi.)

Esimerkiksi seuraava ohjelma on C-kielellä kirjoitettu funktio, joka lajittelee pituutta n olevan kokonaislukutaulukon a kuplalajittelulla.

void bubble_sort(int *a, int n) {
  int i, j;
  for (i = 0; i < n - 1; ++i) {
    for (j = 0; j < n - 1; ++j) {
      if (a[j] > a[j + 1]) {
        /* The following 3 lines correspond to 1 swap of integers */
        int x = a[j];
        a[j] = a[j + 1];
        a[j + 1] = x;
      }
    }
  }
}

Tehtävä

Annetaan pituutta $N$ oleva lukujono $A$. Oletetaan, että muodostetaan lukujono $A'$ vaihtamalla $2$ mielivaltaisissa kohdissa olevan kokonaisluvun paikkaa lukujonossa $A$ täsmälleen $1$ kerran. Kirjoita ohjelma, joka etsii lukujonon $A'$ kuplalajittelun vaihtojen lukumäärän pienimmän mahdollisen arvon. (Huomaa, että aluksi vaihdettavien $2$ kokonaisluvun ei tarvitse välttämättä olla vierekkäisiä.)

Rajoitukset

  • $1 \le N \le 100000$: lukujonon $A$ pituus.
  • $1 \le A_i \le 1000000000$: lukujonoon $A$ sisältyvien lukujen suuruus.

Syöte

Lue vakiosyötteestä seuraavat tiedot:

  • $1$. rivillä on kokonaisluku $N$. $N$ ilmaisee lukujonon $A$ pituuden.
  • Seuraavien $N$ rivin $i$. rivillä ($1 \le i \le N$) on kokonaisluku $A_i$. Tämä ilmaisee lukujonon $A$ $i$. kokonaisluvun.

Tuloste

Tulosta vakiotulosteeseen $1$ riville kokonaisluku, joka ilmaisee lukujonon $A'$ kuplalajittelun vaihtojen pienimmän mahdollisen lukumäärän.

Arvosteluperusteet

  • Arvosteludatasta $10\%$ pisteistä täyttää ehdon $N \le 1000$, ja kaikilla $i, j$ ($1 \le i < j \le N$) pätee $A_i \ne A_j$.
  • Arvosteludatasta $30\%$ pisteistä täyttää ehdon $N \le 5000$, ja kaikilla $i, j$ ($1 \le i < j \le N$) pätee $A_i \ne A_j$.
  • Arvosteludatasta $80\%$ pisteistä kaikilla $i, j$ ($1 \le i < j \le N$) pätee $A_i \ne A_j$.

Esimerkki

Esimerkkisyöte 1

5
10
3
6
8
1

Esimerkkituloste 1

0

Jos lukujonon $A$ ensimmäinen luku $10$ ja viimeinen luku $1$ vaihdetaan keskenään, lukujonosta $A'$ tulee valmiiksi lajiteltu jono, jolloin kuplalajittelun vaihtojen lukumäärä on $0$.


Esimerkkisyöte 2

5
3
1
7
9
5

Esimerkkituloste 2

2

Vaihtamalla lukujonon $A$ $3$. luku $7$ ja viimeinen luku $5$ keskenään saadaan lukujono $A'$, joka on $3, 1, 5, 9, 7$. Lukujonon $A'$ kuplalajittelun vaihtojen lukumäärä on $2$.


Esimerkkisyöte 3

3
1
2
3

Esimerkkituloste 3

1

Vaikka lukujono $A$ olisi valmiiksi lajiteltu jo alussa, lukujonoa $A'$ muodostettaessa on silti suoritettava vaihto.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.