//Brut na szybko #include <iostream> #include <vector> #include <set> using namespace std; vector<pair<int, int>> switches; // Przechowuje pary żarówek, na które wpływają przełączniki set<vector<int>> configurations; // Zestaw unikalnych konfiguracji, które można osiągnąć // Funkcja rekurencyjna do sprawdzania wszystkich możliwych konfiguracji void checkConfigurations(vector<int> &bulbs, int index) { if (index == switches.size()) { configurations.insert(bulbs); // Dodajemy aktualną konfigurację do zestawu unikalnych konfiguracji return; } // Rekurencyjne sprawdzenie bez użycia obecnego przełącznika checkConfigurations(bulbs, index + 1); // Stan żarówek przed zmianą int bulb1 = switches[index].first, bulb2 = switches[index].second; if (bulbs[bulb1] == bulbs[bulb2]) { // Zmieniamy stany żarówek, jeśli obie są w tym samym stanie bulbs[bulb1] = !bulbs[bulb1]; bulbs[bulb2] = !bulbs[bulb2]; // Sprawdzamy konfiguracje po zmianie checkConfigurations(bulbs, index + 1); // Przywracamy poprzednie stany, aby kontynuować sprawdzanie innych kombinacji bulbs[bulb1] = !bulbs[bulb1]; bulbs[bulb2] = !bulbs[bulb2]; } } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<int> bulbs(n); for (int i = 0; i < n; ++i) cin >> bulbs[i]; // Początkowe stany żarówek for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; switches.emplace_back(a - 1, b - 1); // Przełączniki wpływają na pary żarówek, indeksowanie od 0 } checkConfigurations(bulbs, 0); // Rozpoczęcie sprawdzania z początkowym indeksem przełącznika jako 0 cout << configurations.size() << endl; // Wypisanie liczby unikalnych konfiguracji return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | //Brut na szybko #include <iostream> #include <vector> #include <set> using namespace std; vector<pair<int, int>> switches; // Przechowuje pary żarówek, na które wpływają przełączniki set<vector<int>> configurations; // Zestaw unikalnych konfiguracji, które można osiągnąć // Funkcja rekurencyjna do sprawdzania wszystkich możliwych konfiguracji void checkConfigurations(vector<int> &bulbs, int index) { if (index == switches.size()) { configurations.insert(bulbs); // Dodajemy aktualną konfigurację do zestawu unikalnych konfiguracji return; } // Rekurencyjne sprawdzenie bez użycia obecnego przełącznika checkConfigurations(bulbs, index + 1); // Stan żarówek przed zmianą int bulb1 = switches[index].first, bulb2 = switches[index].second; if (bulbs[bulb1] == bulbs[bulb2]) { // Zmieniamy stany żarówek, jeśli obie są w tym samym stanie bulbs[bulb1] = !bulbs[bulb1]; bulbs[bulb2] = !bulbs[bulb2]; // Sprawdzamy konfiguracje po zmianie checkConfigurations(bulbs, index + 1); // Przywracamy poprzednie stany, aby kontynuować sprawdzanie innych kombinacji bulbs[bulb1] = !bulbs[bulb1]; bulbs[bulb2] = !bulbs[bulb2]; } } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<int> bulbs(n); for (int i = 0; i < n; ++i) cin >> bulbs[i]; // Początkowe stany żarówek for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; switches.emplace_back(a - 1, b - 1); // Przełączniki wpływają na pary żarówek, indeksowanie od 0 } checkConfigurations(bulbs, 0); // Rozpoczęcie sprawdzania z początkowym indeksem przełącznika jako 0 cout << configurations.size() << endl; // Wypisanie liczby unikalnych konfiguracji return 0; } |