#include <iostream> #include <algorithm> #include <vector> #include <set> #include <cassert> #include <chrono> #include <bitset> using namespace std; namespace des { struct Rozkaz { int poczatek; int koniec; }; bool czyBitZapalony(unsigned long long uporzadkowanie, unsigned long long numerBitu) { return (uporzadkowanie & (1ll << numerBitu)); } unsigned long long zapalBit(unsigned long long uporzadkowanie, unsigned long long numerBitu) { uporzadkowanie = uporzadkowanie | (1ll << numerBitu); return uporzadkowanie; } unsigned long long zgasBit(unsigned long long uporzadkowanie, unsigned long long numerBitu) { uporzadkowanie = uporzadkowanie & (~(1ll << numerBitu)); return uporzadkowanie; } unsigned long long applyRozkaz(unsigned long long uporzadkowanie, Rozkaz const& rozkaz) { unsigned long long result = uporzadkowanie; if (czyBitZapalony(uporzadkowanie, rozkaz.poczatek) && !czyBitZapalony(uporzadkowanie, rozkaz.koniec)) { result = zgasBit(result, rozkaz.poczatek); result = zapalBit(result, rozkaz.koniec); } return result; } unsigned long long policzLiczbeWczesniejszychKonfiguracji(unsigned long long uporzadkowanie, std::vector<des::Rozkaz> & rozkazy, int ktoryRozkaz) { if (ktoryRozkaz < 0) return 1; des::Rozkaz rozkaz = rozkazy[ktoryRozkaz]; bool pierwszyZapalony = czyBitZapalony(uporzadkowanie, rozkaz.poczatek); bool drugiZapalony = czyBitZapalony(uporzadkowanie, rozkaz.koniec); if (pierwszyZapalony == drugiZapalony) return policzLiczbeWczesniejszychKonfiguracji(uporzadkowanie, rozkazy, ktoryRozkaz-1); if (pierwszyZapalony && ! drugiZapalony) return 0; unsigned long long suma = 0; suma += policzLiczbeWczesniejszychKonfiguracji(uporzadkowanie, rozkazy, ktoryRozkaz - 1); unsigned long long noweUporzadkowanie = uporzadkowanie; noweUporzadkowanie = zapalBit(noweUporzadkowanie, rozkaz.poczatek); noweUporzadkowanie = zgasBit(noweUporzadkowanie, rozkaz.koniec); suma += policzLiczbeWczesniejszychKonfiguracji(noweUporzadkowanie, rozkazy, ktoryRozkaz - 1); return suma; } } int main() { int iloscZolnierzy; int iloscRozkazow; std::cin >> iloscZolnierzy >> iloscRozkazow; std::vector<des::Rozkaz> rozkazy; for (int i = 0; i < iloscRozkazow; ++i) { des::Rozkaz rozkaz; std::cin >> rozkaz.poczatek >> rozkaz.koniec; rozkaz.poczatek--; rozkaz.koniec--; rozkazy.push_back(rozkaz); } std::vector<unsigned long long> sumaDobrych(iloscZolnierzy + 1, 0); for (int pierwszyGotowy = 0; pierwszyGotowy < iloscZolnierzy; ++pierwszyGotowy) { for (int ostatniGotowy = pierwszyGotowy; ostatniGotowy < iloscZolnierzy; ++ostatniGotowy) { unsigned long long koncoweUporzadkowanie = 0; for (int i = pierwszyGotowy; i <= ostatniGotowy; ++i) { koncoweUporzadkowanie= des::zapalBit(koncoweUporzadkowanie, i); } int ilosc = ostatniGotowy - pierwszyGotowy + 1; sumaDobrych[ilosc] += policzLiczbeWczesniejszychKonfiguracji(koncoweUporzadkowanie, rozkazy, rozkazy.size()-1); } } /*for (int i = 1; i <= iloscZolnierzy; ++i) { std::cout << sumaDobrych[i] << " "; }*/ //std::cout << "\n"; for (int i = 1; i <= iloscZolnierzy; ++i) { std::cout << (sumaDobrych[i] % 2) << " "; } std::cout << "\n"; 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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include <algorithm> #include <vector> #include <set> #include <cassert> #include <chrono> #include <bitset> using namespace std; namespace des { struct Rozkaz { int poczatek; int koniec; }; bool czyBitZapalony(unsigned long long uporzadkowanie, unsigned long long numerBitu) { return (uporzadkowanie & (1ll << numerBitu)); } unsigned long long zapalBit(unsigned long long uporzadkowanie, unsigned long long numerBitu) { uporzadkowanie = uporzadkowanie | (1ll << numerBitu); return uporzadkowanie; } unsigned long long zgasBit(unsigned long long uporzadkowanie, unsigned long long numerBitu) { uporzadkowanie = uporzadkowanie & (~(1ll << numerBitu)); return uporzadkowanie; } unsigned long long applyRozkaz(unsigned long long uporzadkowanie, Rozkaz const& rozkaz) { unsigned long long result = uporzadkowanie; if (czyBitZapalony(uporzadkowanie, rozkaz.poczatek) && !czyBitZapalony(uporzadkowanie, rozkaz.koniec)) { result = zgasBit(result, rozkaz.poczatek); result = zapalBit(result, rozkaz.koniec); } return result; } unsigned long long policzLiczbeWczesniejszychKonfiguracji(unsigned long long uporzadkowanie, std::vector<des::Rozkaz> & rozkazy, int ktoryRozkaz) { if (ktoryRozkaz < 0) return 1; des::Rozkaz rozkaz = rozkazy[ktoryRozkaz]; bool pierwszyZapalony = czyBitZapalony(uporzadkowanie, rozkaz.poczatek); bool drugiZapalony = czyBitZapalony(uporzadkowanie, rozkaz.koniec); if (pierwszyZapalony == drugiZapalony) return policzLiczbeWczesniejszychKonfiguracji(uporzadkowanie, rozkazy, ktoryRozkaz-1); if (pierwszyZapalony && ! drugiZapalony) return 0; unsigned long long suma = 0; suma += policzLiczbeWczesniejszychKonfiguracji(uporzadkowanie, rozkazy, ktoryRozkaz - 1); unsigned long long noweUporzadkowanie = uporzadkowanie; noweUporzadkowanie = zapalBit(noweUporzadkowanie, rozkaz.poczatek); noweUporzadkowanie = zgasBit(noweUporzadkowanie, rozkaz.koniec); suma += policzLiczbeWczesniejszychKonfiguracji(noweUporzadkowanie, rozkazy, ktoryRozkaz - 1); return suma; } } int main() { int iloscZolnierzy; int iloscRozkazow; std::cin >> iloscZolnierzy >> iloscRozkazow; std::vector<des::Rozkaz> rozkazy; for (int i = 0; i < iloscRozkazow; ++i) { des::Rozkaz rozkaz; std::cin >> rozkaz.poczatek >> rozkaz.koniec; rozkaz.poczatek--; rozkaz.koniec--; rozkazy.push_back(rozkaz); } std::vector<unsigned long long> sumaDobrych(iloscZolnierzy + 1, 0); for (int pierwszyGotowy = 0; pierwszyGotowy < iloscZolnierzy; ++pierwszyGotowy) { for (int ostatniGotowy = pierwszyGotowy; ostatniGotowy < iloscZolnierzy; ++ostatniGotowy) { unsigned long long koncoweUporzadkowanie = 0; for (int i = pierwszyGotowy; i <= ostatniGotowy; ++i) { koncoweUporzadkowanie= des::zapalBit(koncoweUporzadkowanie, i); } int ilosc = ostatniGotowy - pierwszyGotowy + 1; sumaDobrych[ilosc] += policzLiczbeWczesniejszychKonfiguracji(koncoweUporzadkowanie, rozkazy, rozkazy.size()-1); } } /*for (int i = 1; i <= iloscZolnierzy; ++i) { std::cout << sumaDobrych[i] << " "; }*/ //std::cout << "\n"; for (int i = 1; i <= iloscZolnierzy; ++i) { std::cout << (sumaDobrych[i] % 2) << " "; } std::cout << "\n"; return 0; } |