QOJ.ac

QOJ

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

#18987. Kapokiers

Statistics

Les quelques kapokiers du jardin natal continuent de pousser dans les souvenirs de 小 N, qui s’estompent peu à peu. Ses souvenirs du jardin sont représentés par une suite $[a_0,a_1,\ldots,a_{n-1}]$ de longueur $n$.

Chaque kapokier a la forme d’un arbre non enraciné dont les nœuds sont étiquetés. Le souvenir d’un kapokier correspond à un intervalle $[l,r)$ de cette suite :

  • L’arbre possède $k=r-l+2$ nœuds, numérotés de $0$ à $k-1$.
  • Sa suite de Prüfer est $[\min(a_l,k-1),\min(a_{l+1},k-1),\ldots,\min(a_{r-1},k-1)]$. La définition de la suite de Prüfer figure dans la section « Remarque ».

En se remémorant le passé, 小 N vous pose $m$ questions. La $i$-ième ($0\le i<m$) est :

  • Dans le kapokier correspondant à l’intervalle $[l_i,r_i)$ de ses souvenirs, les nœuds $x_i,y_i$ sont-ils adjacents ?

Détails d'implémentation

Vous n’avez pas besoin d’implémenter la fonction main, et ne devez pas le faire.

Votre fichier source doit inclure l’en-tête kapok.h. Ajoutez donc au début du programme :

#include "kapok.h"

Vous devez implémenter dans le fichier source soumis kapok.cpp la fonction suivante :

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$ sont respectivement le numéro du test, la longueur de la suite des souvenirs et le nombre de questions. $c=0$ indique un exemple.
  • a représente la suite des souvenirs.
  • l,r représentent les deux extrémités de l’intervalle donné pour chaque question.
  • x,y représentent les deux numéros de nœuds donnés pour chaque question.
  • La fonction doit retourner une suite $f_0,f_1,\ldots,f_{m-1}$ de longueur exactement $m$, où $f_i$ ($0\le i<m$) est le résultat de la $i$-ième question.
  • Pour chaque test, l’évaluateur appelle cette fonction exactement une fois.

Le fichier template_kapok.cpp du répertoire du problème fournit un exemple de code que vous pouvez utiliser comme référence pour votre implémentation.

Tester votre programme

Vous pouvez compiler un exécutable dans le répertoire du problème avec la commande :

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

L’exécutable kapok ainsi obtenu fonctionne comme suit :

  • Il lit sur l’entrée standard les données suivantes :

    • La première ligne contient trois entiers non négatifs $c,n,m$.
    • La deuxième ligne contient $n$ entiers non négatifs $a_0,a_1,\ldots,a_{n-1}$.
    • La ligne $i+3$ ($0\le i<m$) contient quatre entiers non négatifs $l_i,r_i,x_i,y_i$.
  • Il écrit sur la sortie standard les données suivantes :

    • La ligne $i+1$ ($0\le i<m$) contient un entier non négatif : 0 signifie que $f_i$ vaut false et 1 qu’il vaut true.

Exemples

Entrée 1

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

Sortie 1

1
0
1

Remarque

  • L’intervalle $[0,3)$ correspond à un arbre de 5 nœuds, de suite de Prüfer $[2,0,2]$ et d’ensemble d’arêtes $\{(1,2),(0,3),(0,2),(2,4)\}$. Les nœuds $0,2$ sont donc adjacents.
  • L’intervalle $[3,5)$ correspond à un arbre de 4 nœuds, de suite de Prüfer $[3,0]$ et d’ensemble d’arêtes $\{(1,3),(0,2),(0,3)\}$. Les nœuds $1,2$ ne sont donc pas adjacents.
  • L’intervalle $[0,0)$ correspond à un arbre de 2 nœuds dont la suite de Prüfer est vide. Son unique arête est $(0,1)$ ; les nœuds $0,1$ sont donc adjacents.

Exemples 2

Voir kapok/kapok2.in et kapok/kapok2.ans dans le répertoire du candidat.

Cet exemple satisfait les contraintes des tests $3\sim5$.

Exemples 3

Voir kapok/kapok3.in et kapok/kapok3.ans dans le répertoire du candidat.

Cet exemple satisfait les contraintes des tests $3\sim5$.

Contraintes

Pour tous les tests :

  • $1\le n,m\le2\times10^5$.
  • Pour tout $0\le i<n$, $0\le a_i<n+2$.
  • Pour tout $0\le i<m$, $0\le l_i\le r_i\le n$ et $0\le x_i,y_i<r_i-l_i+2$.
Numéros des tests $n,m\le$ Propriétés particulières
$1,2$ $500$ Aucune
$3\sim5$ $5\,000$
$6,7$ $2\times10^5$ Pour tout $0\le i<n$, $a_i<10$
$8,9$ Pour tout $0\le i<n$, $a_i<10^3$
$10,11$ Pour tout $0\le i<m$, $x_i,y_i<10$
$12,13$ Pour tout $0\le i<m$, $x_i,y_i<10^3$
$14\sim16$ A
$17\sim19$ Pour tout $0\le i<m$, $r_i=n$
$20\sim22$ $10^5$ Aucune
$23\sim25$ $2\times10^5$
  • Propriété particulière A : pour tout $0\le i<m$, une fois $l_i,r_i$ fixés, les couples ordonnés $x_i,y_i$ sont générés indépendamment et uniformément parmi tous ceux qui satisfont les restrictions.

Remarque

Pour un arbre non enraciné $T$ dont les nœuds sont numérotés de $0$ à $c-1$ ($c\ge2$) :

  • Effectuez successivement $c-2$ opérations. La $i$-ième ($0\le i<c-2$) consiste à :

    • Trouver la feuille actuelle de plus petit numéro $v_i$.
    • Noter le numéro $p_i$ de son unique voisin.
    • Supprimer ensuite de $T$ le nœud $v_i$ et son unique arête incidente.
  • La suite $[p_0,p_1,\ldots,p_{c-3}]$ de longueur $c-2$ ainsi obtenue est la suite 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.