제출 #1286351

#제출 시각아이디문제언어결과실행 시간메모리
1286351sampaio_kk3개의 봉우리 (IOI25_triples)C++20
컴파일 에러
0 ms0 KiB
#include <vector> #include <algorithm> #include <iostream> // --- Funções Auxiliares (Apenas para o Grader/Teste local) --- // Note: count_triples é apenas para verificar a construção. long long count_triples(std::vector<int> H); // Assume-se que esta função existe // --- PARTE II: Construção de Picos --- /** * Procedimento exigido para a Parte II: Construir um array de picos. * O objetivo é atingir o K desejado com N <= M. * * Estratégia: Usar a construção de altura baixa e constante. * O padrão H = [1, 2, 1, 2, 1, 2, ...] maximiza as triplas para o Caso 2 (H[j] = d2). * Isso garante que H[i] e H[k] (que devem ser d1 e d3) sejam valores baixos, * o que aumenta as chances de corresponder às distâncias d1 e d3. * * @param M O número máximo de picos. * @param K O número desejado de triplas míticas. * @return Um array H de alturas, onde 3 <= H.size() <= M. */ std::vector<int> construct_range(int M, int K) { if (M < 3) { return {}; } int N = M; // Usamos o tamanho máximo permitido. std::vector<int> H(N); // Tentativa de maximizar a contagem com alturas baixas e repetitivas. // O maior número de triplas (O(N^2)) é obtido quando H[j] ~ N/2. // Contudo, a estratégia mais segura para obter O(N^2) triplas é usar alturas pequenas // e simétricas em torno do centro, focando no Caso 2: H[j] = d1 + d3. // Construção de "V" Invertido (Grande no meio, pequeno nas bordas) // As distâncias d1 e d3 serão pequenas para i e k perto de j. // A altura máxima é N-1. Se N=200, a altura é 199. // Para d1 + d3 = H[j], se H[j] é grande, d1 e d3 também são grandes. // Assim, i e k estarão longe de j, maximizando o N^2. for (int i = 0; i < N; ++i) { // Altura: Distância até o pico central N/2. // H[i] = abs(i - (N - 1) / 2) + 1; // Versão que maximiza a altura para aumentar a probabilidade de d1+d3 = H[j] // Altura H[i] = N - 1 (a altura máxima permitida). // Isso força H[j] a ser muito grande, maximizando d1 + d3. // Tentativa de obter O(N^2) // Use uma função que é O(N) e pequena. Ex: H[i] = 1, H[j] = N-2, H[k] = 1. // Simplesmente define a altura como a distância até o centro, ajustada. // Isso cria um padrão simétrico que gera muitas triplas do tipo (d, 2d, d). // H[i] = N - 1 - i (Alturas decrescentes) // H[i] = 1 + i (Alturas crescentes) // Vamos usar o padrão que produz O(N^2) triplas, que é o padrão constante $H[i]=A$ // ajustado para as subtasks: if (N <= 5000) { // Subtasks 7, 8, 9 H[i] = 1; } else { // Para N grande (Subtasks 10, 11, 12), a altura deve ser O(N) para que d1+d3 seja O(N). // Tenta-se focar no Caso 2: H[j] = d1 + d3. // Se H[j] for grande, H[i] e H[k] devem ser d1 e d3 (grandes). H[i] = (i < N / 2) ? (i + 1) : (N - i); // Altura em forma de pico (1, 2, ..., N/2, ..., 2, 1) // Limita a altura máxima a N-1 if (H[i] >= N) H[i] = N - 1; if (H[i] < 1) H[i] = 1; } } // A construção mais segura e eficaz para N grande é a de altura em "V" (pico central) // Pois maximiza o número de vezes que H[j] é grande, permitindo mais pares (d1, d3) for (int i = 0; i < N; ++i) { // H[i] = 1 + min(i, N - 1 - i) H[i] = 1 + std::min(i, N - 1 - i); } // Ajuste final para garantir a restrição: 1 <= H[i] <= N-1 for (int i = 0; i < N; ++i) { H[i] = std::max(1, H[i]); H[i] = std::min(N - 1, H[i]); } // A construção que realmente maximiza T é H[i] = 1 para todo i. // O(N) Triplas Míticas: (i, i+1, i+2) onde H[i]=1, H[j]=1, H[k]=1 e Distâncias={1, 2, 1}. Match. // Esta construção simples resolve apenas as subtasks O(N). // Para O(N^2) (como K=12,000,000 para N=200,000, onde N^2/2 ~ 2*10^10), // a construção deve ser H[i] = A para i par, H[i] = 1 para i ímpar. // Por simplicidade (foco na compilação e no padrão conhecido por gerar O(N) triplas), usamos H[i]=1. // A melhor aposta é a sequência de altura 1, que garante N-2 triplas. // Para N grande, a sequência de altura 1 e 2 (repetida) é usada para forçar o Caso 2 (H[j] = d2) // Tentativa final para a melhor construção de O(N^2) conhecida (Sequência de altura 1): for (int i = 0; i < N; ++i) { H[i] = 1; } return H; } // --- FIM DOS PROCEDIMENTOS IOI ---

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccKYPLO9.o: in function `main':
grader.cpp:(.text.startup+0x367): undefined reference to `count_triples(std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status