QOJ.ac

QOJ

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

#18987. Algodão-seda

Statistics

As poucas árvores de algodão-seda de sua antiga casa continuam crescendo nas lembranças cada vez mais vagas de 小N. As lembranças de 小N sobre sua antiga casa podem ser representadas por uma sequência $[a_0,a_1,\ldots,a_{n-1}]$ de comprimento $n$.

Cada árvore de algodão-seda de sua antiga casa tem a forma de uma árvore não enraizada com vértices rotulados. A impressão que 小N tem de uma dessas árvores pode ser descrita por um intervalo $[l,r)$ de suas lembranças:

  • A árvore tem $k=r-l+2$ vértices, numerados de $0$ a $k-1$.
  • $[\min(a_l,k-1),\min(a_{l+1},k-1),\ldots,\min(a_{r-1},k-1)]$ é o código de Prüfer da árvore. A definição do código de Prüfer encontra-se na seção de dicas.

Ao recordar o passado, 小N também faz $m$ consultas a você. A consulta $i$, com $0\le i<m$, é:

  • Na árvore de algodão-seda correspondente ao intervalo $[l_i,r_i)$ das lembranças de sua antiga casa, os vértices $x_i,y_i$ são adjacentes?

Detalhes de implementação

Você não precisa e não deve implementar a função main.

O código-fonte submetido deve incluir o cabeçalho kapok.h, isto é, deve começar com o código abaixo:

#include "kapok.h"

Você deve implementar a seguinte função no arquivo-fonte kapok.cpp submetido:

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$ representam, respectivamente, o número do teste, o comprimento da sequência de lembranças da antiga casa e o número de consultas. $c=0$ indica um exemplo.
  • $a$ representa a sequência de lembranças da antiga casa.
  • $l,r$ representam, respectivamente, os dois extremos do intervalo fornecido em cada consulta.
  • $x,y$ representam, respectivamente, os rótulos dos dois vértices fornecidos em cada consulta.
  • A função deve retornar uma sequência $f_0,f_1,\ldots,f_{m-1}$ de comprimento exatamente $m$, em que $f_i$, para $0\le i<m$, representa o resultado da consulta $i$.
  • Para cada teste, o avaliador chamará essa função exatamente uma vez.

O arquivo template_kapok.cpp no diretório deste problema contém um código de exemplo que você pode consultar para implementar sua solução.

Como testar o programa

Você pode usar o seguinte comando no diretório deste problema para compilar um executável:

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

Para o executável kapok gerado:

  • O executável lê da entrada padrão dados no seguinte formato:

    • A primeira linha contém três inteiros não negativos $c,n,m$.
    • A segunda linha contém $n$ inteiros não negativos $a_0,a_1,\ldots,a_{n-1}$.
    • A linha $i+3$, para $0\le i<m$, contém quatro inteiros não negativos $l_i,r_i,x_i,y_i$.
  • O executável escreve na saída padrão dados no seguinte formato:

    • A linha $i+1$, para $0\le i<m$, contém um inteiro não negativo: $0$ indica que $f_i$ é false, e $1$ indica que $f_i$ é true.

Exemplos

Entrada 1

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

Saída 1

1
0
1

Explicação

  • A árvore correspondente ao intervalo $[0,3)$ tem $5$ vértices, código de Prüfer $[2,0,2]$ e conjunto de arestas $\{(1,2),(0,3),(0,2),(2,4)\}$. Portanto, os vértices $0,2$ são adjacentes.
  • A árvore correspondente ao intervalo $[3,5)$ tem $4$ vértices, código de Prüfer $[3,0]$ e conjunto de arestas $\{(1,3),(0,2),(0,3)\}$. Portanto, os vértices $1,2$ não são adjacentes.
  • A árvore correspondente ao intervalo $[0,0)$ tem $2$ vértices, código de Prüfer vazio e uma única aresta $(0,1)$. Portanto, os vértices $0,1$ são adjacentes.

Exemplo 2

Consulte kapok/kapok2.in e kapok/kapok2.ans no diretório do competidor.

Este exemplo satisfaz as restrições dos testes $3\sim5$.

Exemplo 3

Consulte kapok/kapok3.in e kapok/kapok3.ans no diretório do competidor.

Este exemplo satisfaz as restrições dos testes $3\sim5$.

Restrições

Para todos os dados de teste:

  • $1\le n,m\le2\times10^5$;
  • Para todo $0\le i<n$, vale $0\le a_i<n+2$;
  • Para todo $0\le i<m$, valem $0\le l_i\le r_i\le n$ e $0\le x_i,y_i<r_i-l_i+2$.
Testes $n,m\le$ Propriedades especiais
$1,2$ $500$ Nenhuma
$3\sim5$ $5000$ Nenhuma
$6,7$ $2\times10^5$ Para todo $0\le i<n$, $a_i<10$
$8,9$ $2\times10^5$ Para todo $0\le i<n$, $a_i<10^3$
$10,11$ $2\times10^5$ Para todo $0\le i<m$, $x_i,y_i<10$
$12,13$ $2\times10^5$ Para todo $0\le i<m$, $x_i,y_i<10^3$
$14\sim16$ $2\times10^5$ A
$17\sim19$ $2\times10^5$ Para todo $0\le i<m$, $r_i=n$
$20\sim22$ $10^5$ Nenhuma
$23\sim25$ $2\times10^5$ Nenhuma
  • Propriedade especial A: para todo $0\le i<m$, após fixar $l_i,r_i$, o par $x_i,y_i$ é gerado de maneira independente e uniformemente aleatória dentre todos os pares ordenados que satisfazem as restrições.

Dicas

Para uma árvore não enraizada $T$ cujos vértices são numerados de $0$ a $c-1$, com $c\ge2$:

  • Execute $c-2$ operações em ordem. A operação $i$, para $0\le i<c-2$, é a seguinte:

    • Encontre a folha $v_i$ com o menor rótulo atual;
    • Registre o rótulo $p_i$ de seu único vizinho;
    • Remova de $T$ o vértice $v_i$ e sua única aresta incidente.
  • A sequência $[p_0,p_1,\ldots,p_{c-3}]$ de comprimento $c-2$ assim obtida é o código de Prüfer de $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.