#include <cstdio> #include <vector> #include <algorithm> typedef unsigned long long int ULONG; void set(ULONG &state, ULONG p) { state |= (1LL<<p); } void unset(ULONG &state, ULONG p) { state &= (~(1LL<<p)); } unsigned get(ULONG state, ULONG p) { return (state & (1LL<<p)) > 0; } std::vector<ULONG> solve(ULONG s, const std::vector<std::pair<int, int> > &orders) { std::vector<ULONG> states = {s}; for (auto &order : orders) { std::vector<ULONG> nstates; int a = order.first-1; int b = order.second-1; for (auto &state : states) { if (get(state, a) == 0 && get(state, b) == 1) { ULONG ns = state; set(ns, a); unset(ns, b); nstates.push_back(ns); nstates.push_back(state); } else if (get(state, a) == 0 || get(state, b) == 1) { nstates.push_back(state); } } std::sort(nstates.begin(), nstates.end()); nstates.erase( std::unique(nstates.begin(), nstates.end() ), nstates.end() ); states = std::move(nstates); } return states; } int main() { int N,M; std::vector<std::pair<int, int> > orders; scanf("%d %d", &N, &M); for (int i=0; i<M; ++i) { int a,b; scanf("%d %d", &a, &b); orders.emplace_back(a,b); } std::reverse(orders.begin(), orders.end()); for (int k=1; k<=N; ++k) { std::vector<ULONG> result; for (int spos=0; spos+k<=N; ++spos) { ULONG state = 0; for (int p=spos; p-spos<k; ++p) { set(state, p); } auto tmp = solve(state, orders); result.insert(result.end(), tmp.begin(), tmp.end()); } std::sort(result.begin(), result.end() ); result.erase( std::unique(result.begin(), result.end() ), result.end() ); printf("%d ", (int)(result.size() % 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 77 78 79 | #include <cstdio> #include <vector> #include <algorithm> typedef unsigned long long int ULONG; void set(ULONG &state, ULONG p) { state |= (1LL<<p); } void unset(ULONG &state, ULONG p) { state &= (~(1LL<<p)); } unsigned get(ULONG state, ULONG p) { return (state & (1LL<<p)) > 0; } std::vector<ULONG> solve(ULONG s, const std::vector<std::pair<int, int> > &orders) { std::vector<ULONG> states = {s}; for (auto &order : orders) { std::vector<ULONG> nstates; int a = order.first-1; int b = order.second-1; for (auto &state : states) { if (get(state, a) == 0 && get(state, b) == 1) { ULONG ns = state; set(ns, a); unset(ns, b); nstates.push_back(ns); nstates.push_back(state); } else if (get(state, a) == 0 || get(state, b) == 1) { nstates.push_back(state); } } std::sort(nstates.begin(), nstates.end()); nstates.erase( std::unique(nstates.begin(), nstates.end() ), nstates.end() ); states = std::move(nstates); } return states; } int main() { int N,M; std::vector<std::pair<int, int> > orders; scanf("%d %d", &N, &M); for (int i=0; i<M; ++i) { int a,b; scanf("%d %d", &a, &b); orders.emplace_back(a,b); } std::reverse(orders.begin(), orders.end()); for (int k=1; k<=N; ++k) { std::vector<ULONG> result; for (int spos=0; spos+k<=N; ++spos) { ULONG state = 0; for (int p=spos; p-spos<k; ++p) { set(state, p); } auto tmp = solve(state, orders); result.insert(result.end(), tmp.begin(), tmp.end()); } std::sort(result.begin(), result.end() ); result.erase( std::unique(result.begin(), result.end() ), result.end() ); printf("%d ", (int)(result.size() % 2)); } return 0; } |