QOJ.ac

QOJ

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

#18987. Капок

Statistics

Кілька капокових дерев із рідного саду досі ростуть у спогадах N, що поступово тьмяніють. Її пам'ять про сад можна подати послідовністю $[a_0,a_1,\ldots,a_{n-1}]$ довжини $n$.

Кожне капокове дерево в саду має вигляд некореневого дерева з пронумерованими вершинами. Спогад N про одне дерево описується відрізком $[l,r)$ її пам'яті:

  • Дерево має $k=r-l+2$ вершини, пронумеровані від $0$ до $k-1$.
  • $[\min(a_l,k-1),\min(a_{l+1},k-1),\ldots,\min(a_{r-1},k-1)]$ — послідовність Прюфера цього дерева. Її означення наведено в розділі «Примітки».

Згадуючи минуле, N також ставить вам $m$ запитань. Запитання $i$ ($0\le i<m$) таке:

  • Чи суміжні вершини $x_i,y_i$ капокового дерева, що відповідає відрізку пам'яті $[l_i,r_i)$?

Деталі реалізації

Ви не повинні й не маєте реалізовувати функцію main.

Переконайтеся, що поданий вихідний файл містить заголовок kapok.h, додавши на початку програми:

#include "kapok.h"

У файлі kapok.cpp потрібно реалізувати функцію:

std::vector<bool> kapok(int c, int n, int m,
   std::vector<int> a, std::vector<int> l, std::vector<int>
   r, std::vector<int> x, std::vector<int> y);
  • $c,n,m$ — номер тесту, довжина послідовності спогадів та кількість запитань відповідно. Значення $c=0$ означає приклад.
  • $a$ — послідовність спогадів про рідний сад.
  • $l,r$ — кінці відрізка в кожному запитанні.
  • $x,y$ — номери двох вершин у кожному запитанні.
  • Функція має повернути послідовність $f_0,f_1,\ldots,f_{m-1}$ довжини рівно $m$, де $f_i$ ($0\le i<m$) — результат запитання $i$.
  • Для кожного тесту система оцінювання викликає цю функцію рівно один раз.

Файл template_kapok.cpp у каталозі задачі містить приклад коду, яким можна скористатися під час реалізації власного розв'язку.

Тестування програми

У каталозі задачі можна скомпілювати виконуваний файл командою:

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

Для отриманого виконуваного файлу kapok:

  • Програма зчитує зі стандартного вводу дані такого формату:

    • Перший рядок містить три невід'ємні цілі числа $c,n,m$.
    • Другий рядок містить $n$ невід'ємних цілих чисел $a_0,a_1,\ldots,a_{n-1}$.
    • Рядок $i+3$ ($0\le i<m$) містить чотири невід'ємні цілі числа $l_i,r_i,x_i,y_i$.
  • Програма виводить до стандартного виводу дані такого формату:

    • Рядок $i+1$ ($0\le i<m$) містить одне невід'ємне ціле число: $0$ означає, що $f_i$ дорівнює false, а $1$ — true.

Приклади

Вхідні дані 1

0 8 3
2 0 2 6 0 7 2 2
0 3 0 2
3 5 1 2
0 0 0 1

Вихідні дані 1

1
0
1

Пояснення

  • Відрізку $[0,3)$ відповідає дерево з 5 вершинами, послідовністю Прюфера $[2,0,2]$ та множиною ребер $\{(1,2),(0,3),(0,2),(2,4)\}$. Отже, вершини $0,2$ суміжні.
  • Відрізку $[3,5)$ відповідає дерево з 4 вершинами, послідовністю Прюфера $[3,0]$ та множиною ребер $\{(1,3),(0,2),(0,3)\}$. Отже, вершини $1,2$ не суміжні.
  • Відрізку $[0,0)$ відповідає дерево з 2 вершинами й порожньою послідовністю Прюфера. Єдине ребро — $(0,1)$, тому вершини $0,1$ суміжні.

Приклад 2

Дивіться файли kapok/kapok2.in та kapok/kapok2.ans у каталозі учасника.

Цей приклад задовольняє обмеження тестів $3\sim5$.

Приклад 3

Дивіться файли kapok/kapok3.in та kapok/kapok3.ans у каталозі учасника.

Цей приклад задовольняє обмеження тестів $3\sim5$.

Обмеження

Для всіх тестових даних:

  • $1\le n,m\le2\times10^5$.
  • Для всіх $0\le i<n$ виконується $0\le a_i<n+2$.
  • Для всіх $0\le i<m$ виконується $0\le l_i\le r_i\le n$ та $0\le x_i,y_i<r_i-l_i+2$.
Номери тестів $n,m\le$ Особлива властивість
$1,2$ $500$ Немає
$3\sim5$ $5000$ Немає
$6,7$ $2\times10^5$ Для всіх $0\le i<n$: $a_i<10$
$8,9$ $2\times10^5$ Для всіх $0\le i<n$: $a_i<10^3$
$10,11$ $2\times10^5$ Для всіх $0\le i<m$: $x_i,y_i<10$
$12,13$ $2\times10^5$ Для всіх $0\le i<m$: $x_i,y_i<10^3$
$14\sim16$ $2\times10^5$ A
$17\sim19$ $2\times10^5$ Для всіх $0\le i<m$: $r_i=n$
$20\sim22$ $10^5$ Немає
$23\sim25$ $2\times10^5$ Немає
  • Особлива властивість A: для всіх $0\le i<m$ після задання $l_i,r_i$ вершини $x_i,y_i$ генеруються незалежно й рівномірно випадково серед усіх упорядкованих пар вершин, що задовольняють обмеження.

Примітки

Для некореневого дерева $T$ з вершинами, пронумерованими від $0$ до $c-1$ ($c\ge2$):

  • Послідовно виконайте $c-2$ операції. Операція $i$ ($0\le i<c-2$) така:

    • Знайдіть поточний листок $v_i$ з найменшим номером.
    • Запишіть номер $p_i$ єдиної суміжної з ним вершини.
    • Видаліть із $T$ вершину $v_i$ та її єдине ребро.
  • Отримана послідовність $[p_0,p_1,\ldots,p_{c-3}]$ довжини $c-2$ і є послідовністю Прюфера дерева $T$.

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.