Resolução das Questões A-C do Codeforces Round 911 (Div. 2)

A. Cobirndo com Água

Aálise

O comportamento da água segue uma lógica semelhante à de jogos de sandbox: quando uma célula vazia possui água em ambos os lados, ela é preenchida automaticamente. Com a operação 2, é possível criar um gerador de água infinita. Portanto, ao idantificar três ou mais células vazias consecutivas, basta duas aplicações da operação 1 para estabelecer esse fluxo contínuo e preencher tudo. Caso contrário, sem sequências de tamanho 3 ou superior, cada célula deve ser preenchida manualmente.

Implementação

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int casos;
    cin >> casos;
    while (casos--) {
        int tamanho;
        string faixa;
        cin >> tamanho >> faixa;
        
        faixa = "#" + faixa + "#";
        int sequencia = 0, total = 0;
        
        for (int i = 0; i < tamanho + 2; i++) {
            if (faixa[i] == '.') {
                sequencia++;
                if (sequencia >= 3) {
                    total = 2;
                    break;
                }
            } else {
                if (total != 2) total += sequencia;
                sequencia = 0;
            }
        }
        
        cout << total << '\n';
    }
    return 0;
}

B. Operações da Laura

Análise

Para manter um valor intacto, é preciso que os outros dois se igualem. Observando as operações: ao reduzir a diferença entre dois números, eventualmente precisamos que essa diferença seja nula. O processo envolve equalizar parcialmente e verificar se a diferença restante é divisível por 2, garantindo paridade para que ambos cheguem ao mesmo valor simultaneamente.

Implementação

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int consultas;
    cin >> consultas;
    while (consultas--) {
        long long x, y, z;
        cin >> x >> y >> z;
        
        cout << (abs(y - z) % 2 == 0) << ' ';
        cout << (abs(x - z) % 2 == 0) << ' ';
        cout << (abs(x - y) % 2 == 0) << '\n';
    }
    return 0;
}

C. Árvore Binária do Anji

Análise

O problema exige encontrar o menor número de alterações para que um caminho válido exista da raiz até alguma folha. Cada nó armazena filho esquerdo, filho direito e a direção atual indicada. A estratégia consiste em explorar recursivamente, acumulando o custo de mudanças necessárias quando a direção não corresponde ao caminho desejado.

Implementação

#include <bits/stdc++.h>
using namespace std;

struct No {
    int esq = 0;
    int dir = 0;
    char sentido = 'U';
};

int melhor = INT_MAX;
vector<No> arvore;

void buscar(int atual, int acumulado) {
    if (atual == 0) return;
    
    if (arvore[atual].esq == 0 && arvore[atual].dir == 0) {
        melhor = min(melhor, acumulado);
        return;
    }
    
    int filhoEsq = arvore[atual].esq;
    int filhoDir = arvore[atual].dir;
    char orientacao = arvore[atual].sentido;
    
    if (orientacao == 'L') {
        buscar(filhoEsq, acumulado);
        arvore[atual].sentido = 'R';
        buscar(filhoDir, acumulado + 1);
        arvore[atual].sentido = 'L';
    } else if (orientacao == 'R') {
        buscar(filhoDir, acumulado);
        arvore[atual].sentido = 'L';
        buscar(filhoEsq, acumulado + 1);
        arvore[atual].sentido = 'R';
    } else {
        arvore[atual].sentido = 'L';
        buscar(filhoEsq, acumulado + 1);
        arvore[atual].sentido = 'R';
        buscar(filhoDir, acumulado + 1);
        arvore[atual].sentido = 'U';
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int instancias;
    cin >> instancias;
    
    while (instancias--) {
        int n;
        string direcoes;
        cin >> n >> direcoes;
        
        direcoes = " " + direcoes;
        arvore.assign(n + 1, No());
        melhor = INT_MAX;
        
        for (int i = 1; i <= n; i++) {
            int l, r;
            cin >> l >> r;
            arvore[i].esq = l;
            arvore[i].dir = r;
            arvore[i].sentido = direcoes[i];
        }
        
        buscar(1, 0);
        cout << melhor << '\n';
    }
    return 0;
}

Tags: Codeforces competitive-programming greedy-algorithm depth-first-search Binary-Tree

Publicado em 8-22 02:10