feat: new graph problems formatted.
This commit is contained in:
15
k-esimo-um/statement/description.tex
Normal file
15
k-esimo-um/statement/description.tex
Normal file
@@ -0,0 +1,15 @@
|
||||
Você deve manter um vetor binário, isto é, um vetor cujos elementos são apenas
|
||||
0 ou 1. Inicialmente, o vetor possui $N$ elementos.
|
||||
|
||||
Serão feitas $M$ operações sobre o vetor. Existem dois tipos de operação:
|
||||
|
||||
\begin{itemize}
|
||||
\item inverter o valor de uma posição, trocando 0 por 1 ou 1 por 0;
|
||||
\item encontrar a posição do $k$-ésimo valor 1 no vetor.
|
||||
\end{itemize}
|
||||
|
||||
Os valores 1 são numerados a partir de 0, da esquerda para a direita. Portanto,
|
||||
o valor de $k = 0$ representa o primeiro 1 do vetor, $k = 1$ representa o segundo
|
||||
1, e assim por diante.
|
||||
|
||||
Para cada consulta do segundo tipo, imprima o índice do 1 correspondente.
|
||||
15
k-esimo-um/statement/input.tex
Normal file
15
k-esimo-um/statement/input.tex
Normal file
@@ -0,0 +1,15 @@
|
||||
A primeira linha contém dois inteiros $N$ e $M$
|
||||
($1 \leq N, M \leq 10^5$), o tamanho do vetor e o número de operações.
|
||||
|
||||
A segunda linha contém $N$ inteiros $a_i$, cada um igual a 0 ou 1, representando
|
||||
o estado inicial do vetor.
|
||||
|
||||
As próximas $M$ linhas descrevem as operações. Cada operação tem um dos formatos:
|
||||
|
||||
\begin{itemize}
|
||||
\item \texttt{1 i}: inverta o elemento de índice $i$;
|
||||
\item \texttt{2 k}: imprima o índice do $k$-ésimo valor 1 do vetor.
|
||||
\end{itemize}
|
||||
|
||||
Todos os índices são baseados em 0. Para toda operação do segundo tipo, é
|
||||
garantido que existem pelo menos $k+1$ valores 1 no vetor no momento da consulta.
|
||||
7
k-esimo-um/statement/notes.tex
Normal file
7
k-esimo-um/statement/notes.tex
Normal file
@@ -0,0 +1,7 @@
|
||||
No primeiro exemplo, o vetor inicial é \texttt{[1, 0, 1, 1, 0]}. O primeiro 1
|
||||
está no índice 0, e o terceiro 1 está no índice 3. Depois das inversões, as
|
||||
posições dos valores 1 mudam, e as consultas seguintes refletem esse novo
|
||||
estado.
|
||||
|
||||
Problema adaptado do Codeforces EDU, módulo de árvore de segmentos:
|
||||
\textit{B. K-th one}.
|
||||
2
k-esimo-um/statement/output.tex
Normal file
2
k-esimo-um/statement/output.tex
Normal file
@@ -0,0 +1,2 @@
|
||||
Para cada operação do tipo \texttt{2 k}, imprima uma linha contendo o índice do
|
||||
$k$-ésimo valor 1 no vetor.
|
||||
0
k-esimo-um/statement/preamble.tex
Normal file
0
k-esimo-um/statement/preamble.tex
Normal file
24
k-esimo-um/statement/tutorial.tex
Normal file
24
k-esimo-um/statement/tutorial.tex
Normal file
@@ -0,0 +1,24 @@
|
||||
Uma árvore de segmentos permite manter, para cada intervalo, quantos valores 1
|
||||
existem nele.
|
||||
|
||||
Na construção inicial, cada folha guarda o valor do elemento correspondente do
|
||||
vetor. Cada vértice interno guarda a soma dos dois filhos, ou seja, a quantidade
|
||||
de valores 1 no intervalo representado por esse vértice.
|
||||
|
||||
Para inverter uma posição $i$, alteramos a folha correspondente de 0 para 1 ou
|
||||
de 1 para 0. Em seguida, recalculamos as somas no caminho da folha até a raiz.
|
||||
Essa operação custa $O(\log N)$.
|
||||
|
||||
Para encontrar o $k$-ésimo valor 1, descemos pela árvore a partir da raiz. Seja
|
||||
$L$ a quantidade de valores 1 no filho esquerdo:
|
||||
|
||||
\begin{itemize}
|
||||
\item se $L > k$, então o $k$-ésimo 1 está no filho esquerdo;
|
||||
\item caso contrário, ele está no filho direito, e passamos a procurar o
|
||||
$(k-L)$-ésimo 1 dentro desse filho.
|
||||
\end{itemize}
|
||||
|
||||
Quando chegamos a uma folha, seu índice é a resposta da consulta. A busca também
|
||||
custa $O(\log N)$.
|
||||
|
||||
Assim, a complexidade total é $O((N+M)\log N)$ em tempo e $O(N)$ em memória.
|
||||
Reference in New Issue
Block a user