제출 #1316963

#제출 시각아이디문제언어결과실행 시간메모리
1316963spetrMachine (IOI24_machine)C++20
10 / 100
5 ms440 KiB
#include <vector> #include <algorithm> #include <map> #include <iostream> #include "machine.h" using namespace std; std::vector<int> find_permutation(int N) { // STRATEGIE: Množina {3, 4, ..., N+2} // Vynecháním 0, 1, 2 zaručíme, že se množina při XORu s malým X // netransformuje sama na sebe. vector<int> A(N); vector<int> target_set; map<int, int> val_to_original_index; // Naplníme A čísly 3, 4, ..., N+2 for (int i = 0; i < N; i++) { A[i] = i + 3; val_to_original_index[A[i]] = i; // Uložíme si, kde které číslo bylo } // Uložíme si setříděnou verzi pro porovnávání target_set = A; sort(target_set.begin(), target_set.end()); // 1. Jediný povolený dotaz vector<int> B = use_machine(A); // 2. Najdeme X hrubou silou // Hledáme takové X, pro které platí: sorted(B ^ X) == sorted(A) int found_X = -1; // Musíme vyzkoušet všechna možná X (0-255) for (int cand_X = 0; cand_X <= 255; cand_X++) { vector<int> decoded_B; decoded_B.reserve(N); bool possible = true; for (int x : B) { int val = x ^ cand_X; // Optimalizace: Pokud hodnota po XORu vůbec není v našem rozsahu, // rovnou víme, že toto X je špatné. // Naše hodnoty jsou v rozsahu <3, N+2> if (val < 3 || val > N + 2) { possible = false; break; } decoded_B.push_back(val); } if (!possible) continue; // Pokud čísla sedí rozsahově, zkontrolujeme přesnou shodu množin sort(decoded_B.begin(), decoded_B.end()); if (decoded_B == target_set) { found_X = cand_X; break; // Našli jsme správné X, končíme hledání } } // Záchranná brzda (neměla by nastat, pokud je úloha korektní) if (found_X == -1) { // Pokud se to stane, zkusíme fallback na X=0 nebo vrátíme identitu found_X = 0; } // 3. Rekonstrukce permutace // Víme, že B[i] = A[P[i]] ^ X // Tedy: A[P[i]] = B[i] ^ X // Z hodnoty (B[i] ^ X) zjistíme, na jakém indexu v A byla (pomocí mapy) vector<int> P(N); for (int i = 0; i < N; i++) { int original_val = B[i] ^ found_X; // Najdeme index, na kterém byla tato hodnota v poli A P[i] = val_to_original_index[original_val]; } return P; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...