#include <iostream> #include <vector> #include <unordered_map> using namespace std; vector<pair<int, int>> rozkazy; int K[35]; unordered_map<string, int> memo; // Mapa do przechowywania wyników string generujKlucz(const string& sekwencja, int pozostaleRozkazy) { // Generuje unikalny klucz na podstawie sekwencji żołnierzy i liczby pozostałych rozkazów return sekwencja + "_" + to_string(pozostaleRozkazy); } void czy_mozna_stworzyc(string sekwencja, int k, reverse_iterator<vector<pair<int, int>>::iterator> it, int liczbaRozkazow) { string klucz = generujKlucz(sekwencja, liczbaRozkazow); if (memo.find(klucz) != memo.end()) { // Sprawdza, czy wynik dla tego klucza jest już obliczony K[k] += memo[klucz]; return; } if(it == rozkazy.rend()){ K[k]++; memo[klucz] = 1; // Zapisuje wynik do memo return; } int T = it->first - 1 ,F = it->second - 1; string pom = sekwencja; if(sekwencja[T] == '1' && sekwencja[F] == '0') swap(pom[T],pom[F]); // Próbuje wykonania rozkazu i przechodzi dalej czy_mozna_stworzyc(pom, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów // Sprawdza możliwość bez wykonania rozkazu, jeśli T i F różnią się stanami if (sekwencja[T] != sekwencja[F]) czy_mozna_stworzyc(sekwencja, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów // Memoizacja wyniku nie jest bezpośrednio zastosowana tutaj do zapisywania wyniku // ponieważ aktualizujemy K[k] w trakcie wykonywania funkcji. // Kluczowe jest zapisywanie wyniku dla końcowych konfiguracji. } void generateSequences(int n) { for (int k = 1; k <= n; ++k) { string sequence(n, '0'); for (int j = 0; j < k; ++j) { sequence[j] = '1'; } czy_mozna_stworzyc(sequence, k, rozkazy.rbegin(), rozkazy.size()); } } int main() { cin.tie(0); ios::sync_with_stdio(0); int n,m; cin>>n>>m; rozkazy.reserve(m); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; rozkazy.emplace_back(a,b); } generateSequences(n); for(int i=1;i<=n;i++){ cout<<K[i]%2<<" "; } 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> #include <vector> #include <unordered_map> using namespace std; vector<pair<int, int>> rozkazy; int K[35]; unordered_map<string, int> memo; // Mapa do przechowywania wyników string generujKlucz(const string& sekwencja, int pozostaleRozkazy) { // Generuje unikalny klucz na podstawie sekwencji żołnierzy i liczby pozostałych rozkazów return sekwencja + "_" + to_string(pozostaleRozkazy); } void czy_mozna_stworzyc(string sekwencja, int k, reverse_iterator<vector<pair<int, int>>::iterator> it, int liczbaRozkazow) { string klucz = generujKlucz(sekwencja, liczbaRozkazow); if (memo.find(klucz) != memo.end()) { // Sprawdza, czy wynik dla tego klucza jest już obliczony K[k] += memo[klucz]; return; } if(it == rozkazy.rend()){ K[k]++; memo[klucz] = 1; // Zapisuje wynik do memo return; } int T = it->first - 1 ,F = it->second - 1; string pom = sekwencja; if(sekwencja[T] == '1' && sekwencja[F] == '0') swap(pom[T],pom[F]); // Próbuje wykonania rozkazu i przechodzi dalej czy_mozna_stworzyc(pom, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów // Sprawdza możliwość bez wykonania rozkazu, jeśli T i F różnią się stanami if (sekwencja[T] != sekwencja[F]) czy_mozna_stworzyc(sekwencja, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów // Memoizacja wyniku nie jest bezpośrednio zastosowana tutaj do zapisywania wyniku // ponieważ aktualizujemy K[k] w trakcie wykonywania funkcji. // Kluczowe jest zapisywanie wyniku dla końcowych konfiguracji. } void generateSequences(int n) { for (int k = 1; k <= n; ++k) { string sequence(n, '0'); for (int j = 0; j < k; ++j) { sequence[j] = '1'; } czy_mozna_stworzyc(sequence, k, rozkazy.rbegin(), rozkazy.size()); } } int main() { cin.tie(0); ios::sync_with_stdio(0); int n,m; cin>>n>>m; rozkazy.reserve(m); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; rozkazy.emplace_back(a,b); } generateSequences(n); for(int i=1;i<=n;i++){ cout<<K[i]%2<<" "; } return 0; } |