QOJ.ac

QOJ

時間限制: 2 s 記憶體限制: 512 MB 總分: 100 难度: [顯示] 互動 可 Hack ✓

#24228. Gelé

统计

Detta är en interaktiv uppgift.

På disken i 跳蚤s dessertbutik står två rader av färgglada geléer med två lager (det övre lagret är $a$ och det undre är $b$). Enligt butikens regel om ”kompletterande stelning” är summan av det övre och det undre lagrets höjd i varje gelé exakt $n+1$. Personalen hade ursprungligen ordnat de två raderna efter höjd så att de bildade perfekta permutationer av $1 \sim n$, men i går kväll råkade den livliga butiksanställda 跳蚤 byta plats på geléernas övre och undre lager på vissa positioner!

Nu ska den årliga dessertfestivalen snart öppna, och personalen måste återställa geléernas ursprungliga placering före omkastningarna (alltså höjdföljden $a$ för de övre gelélagren före omkastningarna).

Du kan inte observera geléernas höjder direkt, men du kan ge instruktioner till dessertbutikens automatiska mätinstrument: ange ett antal positioner $i$, så byter instrumentet plats på de övre och undre gelélagren på dessa positioner och returnerar skillnaden mellan den största och den minsta höjden (variationsbredden) i det aktuella övre lagret, samt skillnaden mellan den största och den minsta höjden (variationsbredden) i det undre lagret. Observera: effekten av varje omkastning kvarstår.

Kan du återställa den ursprungliga följden av övre gelélager med ett begränsat antal omkastningar och mätningar?


Interaktionsbiblioteket väljer först en permutation $p$ av $1\sim n$ och konstruerar permutationen $b_i=n+1-p_i$. För varje index $i$ bestämmer biblioteket sedan oberoende om de två talen på position $i$ ska byta plats. De arrayer som erhålls efter dessa byten betecknas med $a,b$. Då gäller alltid $a_i+b_i=n+1$, men $a,b$ behöver inte längre vara permutationer.

Du känner till $n$, men inte de två arrayerna. Du kan välja ett antal positioner och byta plats på $a_i,b_i$ på dessa positioner; interaktionsbiblioteket meddelar variationsbredden för de två arrayerna efter bytena. Effekten av varje byte kvarstår.

Din uppgift är att återställa arrayen $a$ före den första frågan. Svaret anses också korrekt om den returnerade arrayen blir lika med målarrayen först när varje värde $x$ samtidigt ersätts med $n+1-x$.

Implementationsdetaljer

Du behöver inte, och ska inte, implementera funktionen main.

Du ska inkludera headerfilen range.h i källfilen recover.cpp och implementera följande funktion:

std::vector<int> recover(int c, int n);
  • $c$ är numret på den aktuella deluppgiften och är $1,2,3,4$ i de officiella testerna och $0$ i exemplet. $n$ är arrayens längd. Interaktionsbiblioteket anropar recover exakt en gång per testfall.
  • Returvärdet måste vara en heltalsarray av längd $n$ som representerar $a$ före den första frågan, eller dess komplement där alla element ersätts samtidigt.

Du kan anropa följande funktion:

std::pair<int, int> query(const std::vector<int>& positions);
  • Indexen i positions måste vara parvis olika och tillhöra $[0,n-1]$. En tom array får anges.
  • Interaktionsbiblioteket byter plats på de aktuella värdena $a_i,b_i$ exakt en gång för varje index i positions och returnerar sedan variationsbredden för aktuella $a$ och variationsbredden för aktuella $b$. Bytena ackumuleras mellan frågorna, men när du returnerar svaret ska du återställa den ursprungliga arrayen före bytena.
  • Variationsbredden definieras som arrayens största värde minus dess minsta värde. Eftersom $b_i=n+1-a_i$ alltid gäller, är de två variationsbredderna alltid lika.
  • Antalet anrop till query får inte överstiga gränsen $Q_{\max}$ för det aktuella testfallet.

Interaktionsbiblioteket är inte adaptivt: de ursprungliga arrayerna bestäms innan recover börjar och ändras inte som svar på dina frågor. Biblioteket som används vid den slutliga bedömningen kan skilja sig från det medföljande exempelbiblioteket. Ditt program får inte läsa bibliotekets interna data eller direkt använda standardindata eller standardutdata.

Testning av programmet

Lägg recover.cpp, range.h och den bifogade filen grader.cpp i samma katalog och kompilera med C++17:

g++ grader.cpp recover.cpp -o recover -O2 -std=c++17
./recover < ex_range1.in

Den första raden som det lokala interaktionsbiblioteket läser innehåller $c,n,Q_{\max}$; den andra innehåller permutationen $p_0,\ldots,p_{n-1}$; den tredje innehåller $n$ tal som är $0/1$, där $1$ betyder att ett byte sker på den positionen innan interaktionen börjar. Endast $c,n$ tillhandahålls via funktionsparametrarna; permutationen, bytesmarkeringarna och frågegränsen skickas inte direkt till ditt program.

Om svaret är korrekt skriver det lokala interaktionsbiblioteket Correct! på den första raden och Queries used: Q på den andra, där $Q$ är antalet frågor som användes under detta anrop. Om svaret är fel skriver det Wrong answer.; om ett gränssnittsanrop är ogiltigt anges dessutom orsaken på standardfelströmmen.

Exempel

Indata 1

0 6 67
3 1 6 4 2 5
0 1 1 0 1 0

Utdata 1

Correct!
Queries used: 16

Förklaring

I exemplet är $a=(3,6,1,4,5,5)$ innan interaktionen börjar; dess komplement är $(4,1,6,3,2,2)$. Båda är korrekta returvärden. Det första anropet till query({}) returnerar $(5,5)$. Utdata ovan är resultatet från den bifogade referenslösningen; olika korrekta program kan använda olika antal frågor.

Begränsningar

För alla testdata gäller $1\le n\le 500$.

Deluppgift Poäng $n \le$ $Q_{\max} = $ Särskilda egenskaper
$1$ $10$ $20$ $50000$ Inga
$2$ $10$ $100$ $21000$ Inga
$3$ $40$ $500$ $50000$ Ursprungliga $a$ garanteras vara en permutation av $1 \sim n$
$4$ $40$ $500$ $50000$ Inga

Varje deluppgift poängsätts utifrån det testfall som har den lägsta poängmultiplikatorn inom deluppgiften. Detaljer följer nedan.

Poängsättning

Om recover returnerar ett felaktigt svar, om argumenten till query är ogiltiga eller om antalet frågor överstiger $Q_{\max}$, får testfallet $0$ poäng.

Annars får testfallet full poäng för deluppgifterna $1,2$. För deluppgifterna $3,4$, låt $Q$ vara antalet frågor som faktiskt används i testfallet. Poängmultiplikatorn $f(Q)$ beräknas enligt följande tabell:

Intervall för $Q$ $f(Q)$
$Q\le5000$ $1$
$5000 < Q\le10000$ $1-\dfrac{Q-5000}{20000}$
$10000 < Q\le20000$ $\dfrac34-\dfrac{Q-10000}{40000}$
$20000 < Q\le50000$ $\dfrac12-\dfrac{Q-20000}{100000}$
$Q>50000$ $0$
$Q$ Högst $5000$ $10000$ $20000$ $50000$ Över $50000$
$f(Q)$ $100\%$ $75\%$ $50\%$ $20\%$ $0\%$

Poängen för deluppgift $3$ är $40f(Q)$ och poängen för deluppgift $4$ är $40f(Q)$. Slutpoängen avrundas till $3$ decimaler.

Tidsgräns: $2\ \mathrm{s}$.

Minnesgräns: $512\ \mathrm{MiB}$.

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#3106EditorialOpenNew Editorial for Problem #24228wangmaruiView

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.