Task: | Thieves and Prisons |
Sender: | pustaczek |
Submission time: | 2019-03-10 15:13:23 +0200 |
Language: | C++ |
Status: | READY |
Result: | 8 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 8 |
#2 | WRONG ANSWER | 0 |
#3 | WRONG ANSWER | 0 |
#4 | WRONG ANSWER | 0 |
#5 | WRONG ANSWER | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.02 s | 2, 4, 5 | details |
#2 | ACCEPTED | 0.03 s | 2, 4, 5 | details |
#3 | WRONG ANSWER | 0.03 s | 2, 4, 5 | details |
#4 | WRONG ANSWER | 0.02 s | 2, 4, 5 | details |
#5 | ACCEPTED | 0.02 s | 2, 4, 5 | details |
#6 | ACCEPTED | 0.02 s | 4, 5 | details |
#7 | WRONG ANSWER | 0.01 s | 4, 5 | details |
#8 | ACCEPTED | 0.01 s | 4, 5 | details |
#9 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#10 | ACCEPTED | 0.03 s | 1, 3, 4, 5 | details |
#11 | ACCEPTED | 0.03 s | 1, 3, 4, 5 | details |
#12 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#13 | ACCEPTED | 0.02 s | 1, 3, 4, 5 | details |
#14 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#15 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#16 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#17 | ACCEPTED | 0.01 s | 1, 2, 3, 4, 5 | details |
#18 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#19 | ACCEPTED | 0.20 s | 2, 5 | details |
#20 | ACCEPTED | 0.14 s | 2, 5 | details |
#21 | ACCEPTED | 0.15 s | 2, 5 | details |
#22 | ACCEPTED | 0.08 s | 5 | details |
#23 | ACCEPTED | 0.06 s | 5 | details |
#24 | WRONG ANSWER | 0.02 s | 3, 4, 5 | details |
#25 | WRONG ANSWER | 0.02 s | 3, 4, 5 | details |
#26 | WRONG ANSWER | 0.02 s | 3, 4, 5 | details |
#27 | WRONG ANSWER | 0.01 s | 3, 4, 5 | details |
#28 | WRONG ANSWER | 0.02 s | 4, 5 | details |
#29 | WRONG ANSWER | 0.02 s | 4, 5 | details |
#30 | WRONG ANSWER | 0.01 s | 4, 5 | details |
#31 | WRONG ANSWER | 0.01 s | 4, 5 | details |
#32 | WRONG ANSWER | 0.03 s | 2, 4, 5 | details |
#33 | WRONG ANSWER | 0.02 s | 2, 4, 5 | details |
#34 | WRONG ANSWER | 0.01 s | 2, 4, 5 | details |
#35 | WRONG ANSWER | 0.01 s | 2, 4, 5 | details |
#36 | WRONG ANSWER | 0.05 s | 3, 5 | details |
#37 | WRONG ANSWER | 0.06 s | 3, 5 | details |
#38 | WRONG ANSWER | 0.06 s | 3, 5 | details |
#39 | WRONG ANSWER | 0.07 s | 3, 5 | details |
#40 | WRONG ANSWER | 0.14 s | 5 | details |
#41 | WRONG ANSWER | 0.14 s | 5 | details |
#42 | WRONG ANSWER | 0.14 s | 5 | details |
#43 | WRONG ANSWER | 0.13 s | 5 | details |
#44 | WRONG ANSWER | 0.17 s | 2, 5 | details |
#45 | WRONG ANSWER | 0.17 s | 2, 5 | details |
#46 | WRONG ANSWER | 0.16 s | 2, 5 | details |
#47 | WRONG ANSWER | 0.17 s | 2, 5 | details |
Code
#include <bits/stdc++.h>using namespace std;template <typename T> T load() { T r; cin >> r; return r; }template <typename T> vector<T> loadMany(int n) { vector<T> rs(n); generate(rs.begin(), rs.end(), &load<T>); return rs; }template <typename T> typename T::value_type extract(typename T::iterator it, T& xs) { auto x = *it; xs.erase(it); return x; }struct EscapeReq {int thief, t1, t2;int source() { return t1-1; }static bool compT1(EscapeReq a, EscapeReq b) { return a.t1 < b.t1; }static bool compT2(EscapeReq a, EscapeReq b) { return a.t2 < b.t2; }};struct Event {char type;int thief;friend istream& operator>>(istream& in, Event& ev) { in >> ev.type >> ev.thief; --ev.thief; return in; }};struct FluxPrison {int lastBlock, nextBlock, prison, lastOccIndex;static FluxPrison id() { return FluxPrison{-1, numeric_limits<int>::max(), -1, -1}; }static FluxPrison merge(FluxPrison a, FluxPrison b) {return min(a, b, [&](FluxPrison c, FluxPrison d){return c.nextBlock < d.nextBlock;});}};template <typename T> struct Segtree {Segtree(int n):base(1){while (base < n) base *= 2;nodes.resize(base*2, T::id());}void setLeaf(int i, T x) {nodes[base+i] = move(x);for (auto v=(base+i)/2; v>0; v/=2)nodes[v] = T::merge(nodes[v*2], nodes[v*2+1]);}T readRange(int left, int right) const { return implRR(left, right, 0, base, 1); }T implRR(int left, int right, int i, int e, int v) const {if (left >= e or right <= i) return T::id();if (left <= i and right >= e) return nodes[v];return T::merge(implRR(left, right, i, (i+e)/2, v*2), implRR(left, right, (i+e)/2, e, v*2+1));}int base;vector<T> nodes;};vector<int> solve(int n, int k, int m, const vector<Event>& events) {auto occs = vector<vector<int>>(n);for (auto i=0; i<m; ++i)occs[events[i].thief].push_back(i);auto reqs = vector<EscapeReq>();for (auto i=0; i<n; ++i)for (auto j=0; j+1<(int)occs[i].size(); ++j)if (events[occs[i][j]].type == 'C')reqs.push_back(EscapeReq{i, occs[i][j]+1, occs[i][j+1]});sort(reqs.begin(), reqs.end(), &EscapeReq::compT1);// phase 1// - no assignments are made// - make sure thieves required to be free are freeauto qr = set<EscapeReq, decltype(&EscapeReq::compT2)>(&EscapeReq::compT2);auto reqIt = reqs.begin();auto assignment = vector<int>(m, -2);auto lastPrison = -1;auto lastOpening = -1;for (auto i=0; i<m; ++i) {for (;reqIt!=reqs.end() and reqIt->t1 == i; ++reqIt)qr.insert(*reqIt);if (events[i].type == 'O') {lastOpening = i;if (not qr.empty()) {auto req = *qr.begin();qr.erase(qr.begin());assignment[i] = assignment[req.source()] = lastPrison = (lastPrison + 1) % k;}}while (not qr.empty() and qr.begin()->t2 == i+1) {auto req = *qr.begin();qr.erase(qr.begin());if (lastOpening >= req.t1)assignment[req.source()] = lastPrison;elsereturn {};}}// phase 2// - all thieves who were required to be free are free// - make sure no escapes without closing were madeauto filledPrisons = set<int>();auto emptyPrisons = set<int>();auto blocks = vector<vector<int>>(k);auto prevblock = vector<int>(m, -1);for (auto i=0; i<k; ++i)emptyPrisons.insert(i);for (auto i=0; i<m; ++i) {if (events[i].type == 'C') {if (assignment[i] != -2) {if (emptyPrisons.count(assignment[i]))emptyPrisons.erase(emptyPrisons.find(assignment[i])), filledPrisons.insert(assignment[i]);}} else {if (assignment[i] != -2) {if (not blocks[assignment[i]].empty())prevblock[i] = blocks[assignment[i]].back();elseprevblock[i] = -1 - assignment[i];blocks[assignment[i]].push_back(i);if (not filledPrisons.count(assignment[i]))return {};elsefilledPrisons.erase(filledPrisons.find(assignment[i])), emptyPrisons.insert(assignment[i]);}}}// phase 3// - everything so far makes sense and any matching will be correct// - assign unassigned thingsauto closes = set<int>();auto prisons = Segtree<FluxPrison>(k+m+k);auto pseudoNextBlock = [&](int prison, int index){return index < (int)blocks[prison].size() ? blocks[prison][index] : m+prison;};for (auto i=0; i<k; ++i) {auto nb = pseudoNextBlock(i, 0);prisons.setLeaf(k+(-1-i), FluxPrison{-1-i, nb, i, 0});}for (auto i=0; i<m; ++i) {if (events[i].type == 'O') {if (assignment[i] != -2) {auto id = assignment[i];auto b1 = prevblock[i];auto b2 = i;auto old = prisons.readRange(b1+k, b1+k+1);auto b3 = pseudoNextBlock(id, old.lastOccIndex+1);prisons.setLeaf(b1+k, FluxPrison::id());prisons.setLeaf(b2+k, FluxPrison{b2, b3, id, old.lastOccIndex+1});} else {if (closes.empty())return {};auto maxfc = *prev(closes.end());auto prison = prisons.readRange(0, k+maxfc+1);if (prison.prison == -1)return {};auto close = extract(closes.lower_bound(prison.lastBlock), closes);assignment[close] = assignment[i] = prison.prison;auto b1 = prison.lastBlock;auto b2 = i;auto b3 = prison.nextBlock;prisons.setLeaf(b1+k, FluxPrison::id());prisons.setLeaf(b2+k, FluxPrison{b2, b3, prison.prison, prison.lastOccIndex});}} else {if (assignment[i] == -2) {closes.insert(i);}}}// phase 4// - all openings are correctly assigned// - assigned closing anyhowfor (auto i=0; i<m; ++i)if (events[i].type == 'C' and assignment[i] == -2)assignment[i] = 0;return assignment;}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);auto n = load<int>(); // thief countauto k = load<int>(); // prison countauto m = load<int>(); // event countauto events = loadMany<Event>(m);auto answer = solve(n, k, m, events);if (not answer.empty()) {for (auto i : answer)cout << i+1 << ' ';cout << '\n';} elsecout << "IMPOSSIBLE\n";}
Test details
Test 1
Group: 2, 4, 5
Verdict: ACCEPTED
input |
---|
1 1 1 C 1 |
correct output |
---|
1 |
user output |
---|
1 |
Test 2
Group: 2, 4, 5
Verdict: ACCEPTED
input |
---|
1 1 1 O 1 |
correct output |
---|
IMPOSSIBLE |
user output |
---|
IMPOSSIBLE |
Test 3
Group: 2, 4, 5
Verdict: WRONG ANSWER
input |
---|
1 1 2 C 1 C 1 |
correct output |
---|
IMPOSSIBLE |
user output |
---|
1 1 |
Test 4
Group: 2, 4, 5
Verdict: WRONG ANSWER
input |
---|
1 1 2 C 1 O 1 |
correct output |
---|
IMPOSSIBLE |
user output |
---|
1 1 |
Test 5
Group: 2, 4, 5
Verdict: ACCEPTED
input |
---|
1 1 2 O 1 C 1 |
correct output |
---|
IMPOSSIBLE |
user output |
---|
IMPOSSIBLE |
Test 6
Group: 4, 5
Verdict: ACCEPTED
input |
---|
2 1 2 C 1 C 2 |
correct output |
---|
1 1 |
user output |
---|
1 1 |
Test 7
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
2 1 2 C 1 O 1 |
correct output |
---|
IMPOSSIBLE |
user output |
---|
1 1 |
Test 8
Group: 4, 5
Verdict: ACCEPTED
input |
---|
2 1 2 C 1 O 2 |
correct output |
---|
1 1 |
user output |
---|
1 1 |
Test 9
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 5 C 1 C 2 O 3 C 1 ... |
correct output |
---|
1 1 1 1 1 |
user output |
---|
1 1 1 1 1 |
Test 10
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 5 C 1 C 2 O 3 O 3 ... |
correct output |
---|
2 1 2 1 1 |
user output |
---|
1 2 1 2 1 |
Test 11
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 5 C 1 C 2 O 3 O 1 ... |
correct output |
---|
2 1 2 1 1 |
user output |
---|
1 2 1 2 1 |
Test 12
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 5 C 1 C 2 O 1 O 3 ... |
correct output |
---|
IMPOSSIBLE |
user output |
---|
IMPOSSIBLE |
Test 13
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 4 C 1 O 2 C 1 O 3 |
correct output |
---|
1 1 1 1 |
user output |
---|
1 1 1 1 |
Test 14
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 4 C 1 O 2 C 2 O 1 |
correct output |
---|
1 1 1 1 |
user output |
---|
1 1 1 1 |
Test 15
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 3 C 1 C 2 C 3 |
correct output |
---|
1 1 1 |
user output |
---|
1 1 1 |
Test 16
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
3 2 3 O 1 C 2 C 3 |
correct output |
---|
IMPOSSIBLE |
user output |
---|
IMPOSSIBLE |
Test 17
Group: 1, 2, 3, 4, 5
Verdict: ACCEPTED
input |
---|
2 2 7 C 1 O 2 O 2 O 2 ... |
correct output |
---|
IMPOSSIBLE |
user output |
---|
IMPOSSIBLE |
Test 18
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
4 2 5 C 2 O 3 C 1 O 4 ... |
correct output |
---|
1 1 1 1 1 |
user output |
---|
1 1 1 1 1 |
Test 19
Group: 2, 5
Verdict: ACCEPTED
input |
---|
100000 100000 100000 C 1 C 2 C 3 C 4 ... |
correct output |
---|
50000 49999 49998 49997 49996 ... |
user output |
---|
1 2 3 4 5 6 7 8 9 10 11 12 13 ... Truncated |
Test 20
Group: 2, 5
Verdict: ACCEPTED
input |
---|
100000 100000 100000 C 1 C 2 C 3 C 4 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... Truncated |
Test 21
Group: 2, 5
Verdict: ACCEPTED
input |
---|
100000 100000 100000 C 1 C 2 C 3 C 4 ... |
correct output |
---|
20000 20000 20000 20000 20000 ... |
user output |
---|
1 2 3 4 5 6 7 8 9 10 11 12 13 ... Truncated |
Test 22
Group: 5
Verdict: ACCEPTED
input |
---|
100000 100 100000 C 1 C 2 C 3 C 4 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 2 3 4 5 6 7 8 9 10 11 12 13 ... Truncated |
Test 23
Group: 5
Verdict: ACCEPTED
input |
---|
100000 99 100000 C 1 C 2 C 3 C 4 ... |
correct output |
---|
IMPOSSIBLE |
user output |
---|
IMPOSSIBLE |
Test 24
Group: 3, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 2 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
IMPOSSIBLE |
Test 25
Group: 3, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 2 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 ... |
user output |
---|
IMPOSSIBLE |
Test 26
Group: 3, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 2 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 ... |
user output |
---|
IMPOSSIBLE |
Test 27
Group: 3, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 2 500 C 384 O 62 C 387 C 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
IMPOSSIBLE |
Test 28
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
500 250 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 ... Truncated |
Test 29
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
500 250 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 ... |
user output |
---|
1 1 1 1 1 1 2 2 1 1 1 1 1 1 3 ... Truncated |
Test 30
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
500 250 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 3 2 3 3 2 2 2 5 4 2 ... |
user output |
---|
1 1 2 2 7 3 4 3 10 4 5 5 6 8 9... Truncated |
Test 31
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
500 250 500 C 384 O 62 C 387 C 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 7 22 2 1 1 6 16 3 1 1 39 1... Truncated |
Test 32
Group: 2, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 500 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 1 1 1 1 1 1 2 2 1 1 1 1 3 ... Truncated |
Test 33
Group: 2, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 500 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 ... |
user output |
---|
1 1 1 1 1 1 2 2 1 1 1 1 4 1 3 ... Truncated |
Test 34
Group: 2, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 500 500 C 384 O 62 C 387 O 473 ... |
correct output |
---|
1 1 1 1 2 1 3 3 3 2 2 2 2 4 5 ... |
user output |
---|
1 1 2 2 4 8 3 3 9 4 5 5 10 7 6... Truncated |
Test 35
Group: 2, 4, 5
Verdict: WRONG ANSWER
input |
---|
500 500 500 C 384 O 62 C 387 C 473 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 58 59 1 2 4 41 1 1 1 3 7 2... Truncated |
Test 36
Group: 3, 5
Verdict: WRONG ANSWER
input |
---|
100000 2 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
IMPOSSIBLE |
Test 37
Group: 3, 5
Verdict: WRONG ANSWER
input |
---|
100000 2 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 ... |
user output |
---|
IMPOSSIBLE |
Test 38
Group: 3, 5
Verdict: WRONG ANSWER
input |
---|
100000 2 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 ... |
user output |
---|
IMPOSSIBLE |
Test 39
Group: 3, 5
Verdict: WRONG ANSWER
input |
---|
100000 2 100000 C 89384 O 54062 C 85387 C 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
IMPOSSIBLE |
Test 40
Group: 5
Verdict: WRONG ANSWER
input |
---|
100000 50000 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 2 2 3 3 4 4 4 4 4 4 5 5 6 ... Truncated |
Test 41
Group: 5
Verdict: WRONG ANSWER
input |
---|
100000 50000 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 ... |
user output |
---|
1 1 1 1 2 2 3 3 4 4 1 1 5 1 1 ... Truncated |
Test 42
Group: 5
Verdict: WRONG ANSWER
input |
---|
100000 50000 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 3 2 3 3 3 3 3 3 4 5 ... |
user output |
---|
1 1 1 1 1 2 7 2 3 3 4 4 1 6 5 ... Truncated |
Test 43
Group: 5
Verdict: WRONG ANSWER
input |
---|
100000 50000 100000 C 89384 O 54062 C 85387 C 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 1 7 1 12435 1886 1296 1243... Truncated |
Test 44
Group: 2, 5
Verdict: WRONG ANSWER
input |
---|
100000 100000 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 2 2 3 3 4 4 4 4 4 4 5 5 4 ... Truncated |
Test 45
Group: 2, 5
Verdict: WRONG ANSWER
input |
---|
100000 100000 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 ... |
user output |
---|
1 1 2 2 3 3 4 4 5 5 6 6 6 7 6 ... Truncated |
Test 46
Group: 2, 5
Verdict: WRONG ANSWER
input |
---|
100000 100000 100000 C 89384 O 54062 C 85387 O 53318 ... |
correct output |
---|
1 1 1 1 2 1 3 3 3 3 3 3 4 5 3 ... |
user output |
---|
1 1 2 2 8 9 3 3 4 4 5 5 7 6 10... Truncated |
Test 47
Group: 2, 5
Verdict: WRONG ANSWER
input |
---|
100000 100000 100000 C 89384 O 54062 C 85387 C 53318 ... |
correct output |
---|
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
1 1 2338 3481 1 2 8401 4 1 110... Truncated |