#include <cstdio> #include <vector> #include <algorithm> typedef int I; struct Item { I p; I k; I c; I x; bool in(I t) const { return p <= t && t < k && c > 0; } bool nofree() const { return k - p - c - x <= 0; } }; typedef std::vector<Item> VI; typedef std::vector<I> VS; struct CmpByEnd { bool operator()(const Item& a, const Item&b) { return a.k < b.k; } }; static bool cleannofree(VI& v, VS& slots) { for (;;) { bool again = false; for (Item& i : v) { if (i.nofree()) { i.c = 0; for (I t=i.p; t<i.k; ++t) { if (slots[t] == 0) { if (i.x == 0) { return false; } --i.x; continue; } --slots[t]; if (slots[t] == 0) { for (Item& u : v) { if (u.in(t) && !u.nofree()) { ++u.x; } } } } again = true; break; } } if (!again) return true; } } static bool process(VI& v, const I m) { std::sort(v.begin(), v.end(), CmpByEnd()); I tend = v[v.size() - 1].k; I tstart = tend; for (Item& i : v) { if (i.p < tstart) tstart = i.p; } VS slots; slots.resize(tend, m); if (!cleannofree(v, slots)) return false; for (I t=tstart; t<tend; ++t) { bool needclean = false; for (Item& i : v) { if (i.in(t)) { if (slots[t]) { --i.c; ++i.p; --slots[t]; } else { ++i.p; if (i.nofree()) needclean = true; } } } if (needclean && !cleannofree(v, slots)) return false; } return true; } int main() { I N, M, p, k, c; scanf("%d %d\n", &N, &M); VI v; for (I n=0; n<N; ++n) { scanf("%d %d %d\n", &p, &k, &c); v.push_back(Item{p, k, c, 0}); } printf("%s\n", process(v, M)?"TAK":"NIE"); 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 | #include <cstdio> #include <vector> #include <algorithm> typedef int I; struct Item { I p; I k; I c; I x; bool in(I t) const { return p <= t && t < k && c > 0; } bool nofree() const { return k - p - c - x <= 0; } }; typedef std::vector<Item> VI; typedef std::vector<I> VS; struct CmpByEnd { bool operator()(const Item& a, const Item&b) { return a.k < b.k; } }; static bool cleannofree(VI& v, VS& slots) { for (;;) { bool again = false; for (Item& i : v) { if (i.nofree()) { i.c = 0; for (I t=i.p; t<i.k; ++t) { if (slots[t] == 0) { if (i.x == 0) { return false; } --i.x; continue; } --slots[t]; if (slots[t] == 0) { for (Item& u : v) { if (u.in(t) && !u.nofree()) { ++u.x; } } } } again = true; break; } } if (!again) return true; } } static bool process(VI& v, const I m) { std::sort(v.begin(), v.end(), CmpByEnd()); I tend = v[v.size() - 1].k; I tstart = tend; for (Item& i : v) { if (i.p < tstart) tstart = i.p; } VS slots; slots.resize(tend, m); if (!cleannofree(v, slots)) return false; for (I t=tstart; t<tend; ++t) { bool needclean = false; for (Item& i : v) { if (i.in(t)) { if (slots[t]) { --i.c; ++i.p; --slots[t]; } else { ++i.p; if (i.nofree()) needclean = true; } } } if (needclean && !cleannofree(v, slots)) return false; } return true; } int main() { I N, M, p, k, c; scanf("%d %d\n", &N, &M); VI v; for (I n=0; n<N; ++n) { scanf("%d %d %d\n", &p, &k, &c); v.push_back(Item{p, k, c, 0}); } printf("%s\n", process(v, M)?"TAK":"NIE"); return 0; } |