QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 1024 MB Total points: 100 Difficulty: [show] Hackable ✓

#18986. Mediana

Statistics

Dla multizbioru $S=\{x_0,x_1,\ldots,x_{m-1}\}$ o rozmiarze $m$ niech $y_0\ge y_1\ge\cdots\ge y_{m-1}$ będą jego elementami uporządkowanymi malejąco. Jego medianę $\operatorname{Median}(S)$ definiujemy jako $\lceil m/2\rceil$-ty największy element, czyli $\operatorname{Median}(S)=y_{\lceil m/2\rceil-1}$. Uwaga: definicja mediany w tym zadaniu może różnić się od zwykle stosowanej.

Dany jest ciąg $[a_0,a_1,\ldots,a_{n-1}]$ o długości $n$ i dodatnia liczba całkowita $k$ ($k\le n$). Podział definiujemy następująco: wybieramy rosnący ciąg $k-1$ indeksów $0<b_1<\cdots<b_{k-1}<n$, dzieląc pierwotny ciąg na $k$ fragmentów odpowiadających przedziałom indeksów $[0,b_1),[b_1,b_2),\ldots,[b_{k-1},n)$.

Równowagę podziału definiujemy następująco: dla każdego fragmentu obliczamy medianę multizbioru jego elementów, a następnie medianę multizbioru tych $k$ median. Formalnie, dla podziału $b_1,\ldots,b_{k-1}$ przyjmijmy $b_0=0$, $b_k=n$. Niech $c_i=\operatorname{Median}(\{a_{b_i},a_{b_i+1},\ldots,a_{b_{i+1}-1}\})$ będzie medianą elementów fragmentu $i$ ($0\le i<k$). Równowaga podziału wynosi $\operatorname{Median}(\{c_0,\ldots,c_{k-1}\})$.

Wyznacz największą równowagę spośród wszystkich podziałów.

Szczegóły implementacji

Nie musisz i nie powinieneś implementować funkcji main.

Plik źródłowy rozwiązania musi zawierać nagłówek median.h. Dodaj na początku programu:

#include "median.h"

W pliku źródłowym median.cpp zaimplementuj następujące dwie funkcje:

void init(int c, int t);
  • $c,t$ oznaczają odpowiednio numer testu i liczbę zestawów danych. $c=0$ oznacza test przykładowy.
  • Dla każdego testu program oceniający wywoła tę funkcję dokładnie raz, na początku działania programu.
int median(int n, int k, std::vector<int> a);
  • $n,k,a$ oznaczają odpowiednio długość ciągu, liczbę fragmentów w podziale i dany ciąg.
  • Funkcja powinna zwrócić największą równowagę.
  • Dla każdego testu program oceniający wywoła tę funkcję dokładnie $t$ razy.

W katalogu zadania znajduje się przykładowy kod template_median.cpp, z którego możesz skorzystać przy pisaniu własnego rozwiązania.

Testowanie programu

W katalogu zadania możesz skompilować plik wykonywalny poleceniem:

g++ grader.cpp median.cpp -o median -O2 -std=c++14 -static

Otrzymany plik wykonywalny median:

  • Wczytuje ze standardowego wejścia dane w następującym formacie:
    • Pierwszy wiersz zawiera dwie nieujemne liczby całkowite $c,t$.
    • Dalej podane są kolejno zestawy danych. Dla każdego zestawu:
      • Pierwszy wiersz zawiera dwie dodatnie liczby całkowite $n,k$.
      • Drugi wiersz zawiera $n$ dodatnich liczb całkowitych $a_0,a_1,\ldots,a_{n-1}$.
  • Wypisuje na standardowe wyjście dane w następującym formacie:
    • Dla każdego zestawu wypisuje w osobnym wierszu jedną dodatnią liczbę całkowitą: największą równowagę.

Przykład

Wejście 1

0 2
10 4
6 5 1 9 2 3 10 7 4 8
10 5
5 7 3 10 8 2 9 1 6 4

Wyjście 1

9
8

Uwagi

Dla pierwszego zestawu jednym z podziałów o największej równowadze jest $b_1=3,b_2=5,b_3=7$. Dzieli on ciąg na cztery fragmenty $[6,5,1]$, $[9,2]$, $[3,10]$, $[7,4,8]$, których mediany wynoszą odpowiednio $5,9,10,7$. Równowaga tego podziału wynosi więc $\operatorname{Median}(\{5,9,10,7\})=9$.

Dla drugiego zestawu jednym z podziałów o największej równowadze jest $b_1=2,b_2=4,b_3=6,b_4=8$. Dzieli on ciąg na pięć fragmentów $[5,7]$, $[3,10]$, $[8,2]$, $[9,1]$, $[6,4]$, których mediany wynoszą odpowiednio $7,10,8,9,6$. Równowaga tego podziału wynosi więc $\operatorname{Median}(\{7,10,8,9,6\})=8$.

Przykład 2

Zobacz pliki median/median2.in i median/median2.ans w katalogu zawodnika.

Przykład spełnia ograniczenia testu $6$.

Przykład 3

Zobacz pliki median/median3.in i median/median3.ans w katalogu zawodnika.

Przykład spełnia ograniczenia testu $9$.

Przykład 4

Zobacz pliki median/median4.in i median/median4.ans w katalogu zawodnika.

Przykład spełnia ograniczenia testu $14$.

Przykład 5

Zobacz pliki median/median5.in i median/median5.ans w katalogu zawodnika.

Przykład spełnia ograniczenia testów $18\sim20$.

Ograniczenia

Niech $N$ oznacza sumę wartości $n$ ze wszystkich zestawów danych w jednym teście. Dla wszystkich danych:

  • $1\le t\le20$.
  • $5\le n\le10^6$, $2\le k\le n$, $N\le10^6$.
  • Dla każdego $0\le i<n$ zachodzi $1\le a_i\le n$.
Numery testów $N\le$ $n\le$ $k$ Własność szczególna
$1,2$ $40$ $20$ $\le n$ Brak
$3\sim5$ $800$ $80$ A
$6$ Brak
$7,8$ $8000$ $800$ A
$9$ Brak
$10$ $2\times10^5$ $2\times10^5$ $=2$
$11$ $=3$
$12,13$ $=5$
$14$ $\le10$
$15$ $\equiv0\pmod2$
$16,17$ $10^6$ $10^6$ $>5$
$18\sim20$ $\le n$

Własność szczególna A: dla każdego $0\le i<n$ zachodzi $a_i\le2$.

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

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.