Task: | Chair Game |
Sender: | Erik Hedin |
Submission time: | 2024-03-11 09:11:57 +0200 |
Language: | C++ (C++17) |
Status: | READY |
Result: | 32 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 8 |
#2 | TIME LIMIT EXCEEDED | 0 |
#3 | ACCEPTED | 4 |
#4 | TIME LIMIT EXCEEDED | 0 |
#5 | TIME LIMIT EXCEEDED | 0 |
#6 | TIME LIMIT EXCEEDED | 0 |
#7 | ACCEPTED | 20 |
#8 | TIME LIMIT EXCEEDED | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.01 s | 1, 7, 8 | details |
#2 | ACCEPTED | 0.01 s | 1, 7, 8 | details |
#3 | ACCEPTED | 0.01 s | 1, 7, 8 | details |
#4 | ACCEPTED | 0.01 s | 1, 7, 8 | details |
#5 | ACCEPTED | 0.02 s | 1, 7, 8 | details |
#6 | ACCEPTED | 0.01 s | 7, 8 | details |
#7 | ACCEPTED | 0.10 s | 7, 8 | details |
#8 | TIME LIMIT EXCEEDED | -- | 2, 8 | details |
#9 | ACCEPTED | 0.01 s | 3, 4, 5, 6, 8 | details |
#10 | ACCEPTED | 0.02 s | 3, 4, 5, 6, 8 | details |
#11 | ACCEPTED | 0.01 s | 3, 4, 5, 6, 8 | details |
#12 | ACCEPTED | 0.18 s | 3, 4, 5, 6, 8 | details |
#13 | ACCEPTED | 0.01 s | 4, 5, 6, 7, 8 | details |
#14 | TIME LIMIT EXCEEDED | -- | 4, 5, 6, 8 | details |
#15 | TIME LIMIT EXCEEDED | -- | 4, 5, 6, 8 | details |
#16 | TIME LIMIT EXCEEDED | -- | 4, 5, 6, 8 | details |
#17 | ACCEPTED | 0.01 s | 5, 6, 7, 8 | details |
#18 | ACCEPTED | 0.43 s | 5, 6, 8 | details |
#19 | ACCEPTED | 0.01 s | 5, 6, 8 | details |
#20 | TIME LIMIT EXCEEDED | -- | 5, 6, 8 | details |
#21 | ACCEPTED | 0.01 s | 1, 6, 7, 8 | details |
#22 | ACCEPTED | 0.03 s | 6, 7, 8 | details |
#23 | TIME LIMIT EXCEEDED | -- | 6, 8 | details |
#24 | TIME LIMIT EXCEEDED | -- | 6, 8 | details |
#25 | TIME LIMIT EXCEEDED | -- | 8 | details |
#26 | TIME LIMIT EXCEEDED | -- | 8 | details |
#27 | ACCEPTED | 0.07 s | 3, 4, 5, 6, 8 | details |
#28 | ACCEPTED | 0.07 s | 8 | details |
#29 | TIME LIMIT EXCEEDED | -- | 8 | details |
#30 | TIME LIMIT EXCEEDED | -- | 8 | details |
Code
#include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <functional> #include <set> #include <map> #include <queue> #include <random> using namespace std; typedef long long int ll; typedef vector<ll> vll; typedef pair<ll, ll> pll; typedef vector<pll> vpll; typedef vector<vll> vvll; typedef vector<bool> vb; typedef vector<vb> vvb; typedef set<pll> spll; #define rep(i, a, b) for (ll i = a; i < b; i++) #define sz(a) (ll) a.size() #define mp(a, b) make_pair(a, b) #define pb(a) push_back(a) #define trav(itr, a, t) for (t::iterator itr = a.begin(); itr != a.end(); itr++) mt19937 mt; ll n; vll s; void solve() { cin >> n; s.resize(n); rep(i, 0, n) cin >> s[i]; if (accumulate(s.begin(), s.end(), 0LL) % n) { cout << "NO\n"; return; } deque<pll> DFS; // set chairs (pos, chair) while (sz(DFS) < n) { DFS.clear(); vll chairs(s.begin(), s.end()); // initialize b, c vll cnt(n + 1, 0); // how many of each chair is left vll options(n, 0); // how many chair types position can use vvb open(n, vb(n + 1, false)); rep(i, 0, n) cnt[chairs[i]]++; rep(i, 0, n) rep(j, 1, n + 1) open[i][j] = cnt[j]; rep(i, 0, n) rep(j, 1, n + 1) options[i] += open[i][j]; set<pll> pq; // (options[i], i) for all i s.t. used[i] = false rep(i, 0, n) pq.insert(mp(options[i], i)); shuffle(chairs.begin(), chairs.end(), mt); vb hit(n, false); // pos is arrival point vb used(n, false); // used for (ll t = 0; (t < 5 * n) && (sz(DFS) < n); t++) { //while (sz(DFS) < n) { pll nxt = *pq.begin(); pq.erase(pq.begin()); //cout << "nxt = (" << nxt.first << ", " << nxt.second << ")" << endl; /* trav(itr, pq, spll) { cout << "(" << itr->first << ", " << itr->second << ") "; } cout << endl; */ if (nxt.first) { for (ll c = sz(chairs) - 1; c >= 0; c--) { ll k = mt() % (c + 1); // pick random chair left if (open[nxt.second][chairs[k]]) { // viable chair // not already hit, add chair s[k] to nxt.second //cout << "add (" << nxt.second << ", " << chairs[k] << ")" << endl; used[nxt.second] = true; hit[(nxt.second + chairs[k]) % n] = true; DFS.pb(mp(nxt.second, chairs[k])); // if s[k] is the last of it's type if (--cnt[chairs[k]] == 0) { rep(i, 0, n) { if (open[i][chairs[k]] && !used[i]) { pq.erase(mp(options[i], i)); options[i]--; open[i][chairs[k]] = false; pq.insert(mp(options[i], i)); } } } // if certain chairs can hit the same pos as nxt.second rep(j, 0, sz(chairs)) { if (cnt[chairs[j]]) { // (nxt.second + s[k] + n - s[j]) % n ll oth = (nxt.second + chairs[k] + n -chairs[j]) % n; if (open[oth][chairs[j]] && !used[oth]) { pq.erase(mp(options[oth], oth)); options[oth]--; open[oth][chairs[j]] = false; pq.insert(mp(options[oth], oth)); } } } swap(chairs[k], chairs.back()); chairs.pop_back(); c = 0; } else { swap(chairs[k], chairs[c]); } } } else { pq.insert(nxt); // undo pll cur = DFS.back(); pq.insert(mp(options[cur.first], cur.first)); //cout << "remove (" << cur.first << ", " << cur.second << ")" << endl; DFS.pop_back(); hit[(cur.first + cur.second) % n] = false; if (cnt[cur.second]++ == 0) { rep(i, 0, n) { if (!hit[(i + cur.second) % n] && !used[i]) { pq.erase(mp(options[i], i)); options[i]++; open[i][cur.second] = true; pq.insert(mp(options[i], i)); } } } rep(j, 0, sz(chairs)) { if (cnt[chairs[j]]) { ll oth = (cur.first + cur.second + n - chairs[j]) % n; if (!open[oth][chairs[j]] && !used[oth]) { pq.erase(mp(options[oth], oth)); options[oth]++; open[oth][chairs[j]] = true; pq.insert(mp(options[oth], oth)); } } } used[cur.first] = false; chairs.pb(cur.second); } } } vll answ(n); rep(i, 0, n) { answ[DFS.front().first] = DFS.front().second; DFS.pop_front(); } cout << "YES\n"; rep(i, 0, n) cout << answ[i] << " "; cout << "\n"; } int main() { cin.tie(NULL)->sync_with_stdio(false); random_device rd; //mt.seed(rd()); mt.seed(0); ll testcases; cin >> testcases; rep(testcase, 0, testcases) { solve(); cout << flush; } return 0; } /* each position has a number of viable chairs each time we add a chair: - we remove this option from ALL empty positions - we remove options for all positions which 'looks' at the now already hit position each position keeps track of possible chairs to add. on average, half of the chair types left should work */
Test details
Test 1
Group: 1, 7, 8
Verdict: ACCEPTED
input |
---|
637 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 2
Group: 1, 7, 8
Verdict: ACCEPTED
input |
---|
246 7 1 1 1 1 1 1 1 7 1 1 2 1 1 7 1 ... |
correct output |
---|
YES 1 1 1 1 1 1 1 YES 1 1 1 1 2 7 1 YES ... |
user output |
---|
YES 1 1 1 1 1 1 1 YES 1 1 1 2 7 1 1 YES ... Truncated |
Test 3
Group: 1, 7, 8
Verdict: ACCEPTED
input |
---|
810 8 1 1 1 1 1 1 1 1 8 1 1 1 8 1 1 2 1 ... |
correct output |
---|
YES 1 1 1 1 1 1 1 1 YES 1 1 2 8 1 1 1 1 YES ... |
user output |
---|
YES 1 1 1 1 1 1 1 1 YES 2 8 1 1 1 1 1 1 YES ... Truncated |
Test 4
Group: 1, 7, 8
Verdict: ACCEPTED
input |
---|
1000 8 8 8 5 2 8 7 6 5 8 6 5 2 2 8 2 1 6 ... |
correct output |
---|
NO YES 8 2 2 6 2 5 1 6 NO NO ... |
user output |
---|
NO YES 2 5 2 6 1 6 2 8 NO NO ... Truncated |
Test 5
Group: 1, 7, 8
Verdict: ACCEPTED
input |
---|
1000 8 2 1 7 7 2 3 8 2 8 4 1 5 4 7 3 5 3 ... |
correct output |
---|
YES 7 2 2 7 1 3 8 2 YES 4 4 7 3 3 5 5 1 YES ... |
user output |
---|
YES 7 2 8 1 2 3 7 2 YES 5 3 4 5 7 4 1 3 YES ... Truncated |
Test 6
Group: 7, 8
Verdict: ACCEPTED
input |
---|
1000 16 15 16 6 4 14 2 1 6 2 16 10 2 9... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 7
Group: 7, 8
Verdict: ACCEPTED
input |
---|
1000 16 2 4 13 6 8 16 12 8 16 5 9 5 9 ... |
correct output |
---|
YES 13 5 2 8 12 2 8 5 16 16 9 6 9 ... |
user output |
---|
YES 6 8 2 16 13 9 12 5 2 4 5 16 9 ... Truncated |
Test 8
Group: 2, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 1 1 2 1 2 ... |
correct output |
---|
YES 1 NO YES 3 1 2 ... |
user output |
---|
(empty) |
Test 9
Group: 3, 4, 5, 6, 8
Verdict: ACCEPTED
input |
---|
988 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 10
Group: 3, 4, 5, 6, 8
Verdict: ACCEPTED
input |
---|
199 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 11
Group: 3, 4, 5, 6, 8
Verdict: ACCEPTED
input |
---|
1000 100 1 1 1 2 1 1 2 2 1 1 1 1 1 2 1 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 12
Group: 3, 4, 5, 6, 8
Verdict: ACCEPTED
input |
---|
1000 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
YES 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
user output |
---|
YES 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... Truncated |
Test 13
Group: 4, 5, 6, 7, 8
Verdict: ACCEPTED
input |
---|
963 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 14
Group: 4, 5, 6, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
979 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
(empty) |
Test 15
Group: 4, 5, 6, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 3 3 1 2 1 1 2 3 1 3 2 1 1 3 1 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
(empty) |
Test 16
Group: 4, 5, 6, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 1 2 2 2 2 1 1 1 2 3 1 1 3 2 1 ... |
correct output |
---|
YES 2 2 2 3 1 2 3 1 2 3 1 3 1 3 1 ... |
user output |
---|
(empty) |
Test 17
Group: 5, 6, 7, 8
Verdict: ACCEPTED
input |
---|
980 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 18
Group: 5, 6, 8
Verdict: ACCEPTED
input |
---|
947 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 19
Group: 5, 6, 8
Verdict: ACCEPTED
input |
---|
1000 100 1 2 4 2 1 3 1 2 2 3 1 1 3 1 4 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 20
Group: 5, 6, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 3 4 4 4 4 4 4 3 3 3 4 4 2 3 3 ... |
correct output |
---|
YES 4 2 4 4 1 3 4 2 4 2 3 4 2 4 4 ... |
user output |
---|
(empty) |
Test 21
Group: 1, 6, 7, 8
Verdict: ACCEPTED
input |
---|
715 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 22
Group: 6, 7, 8
Verdict: ACCEPTED
input |
---|
843 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 23
Group: 6, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 3 4 5 1 4 4 2 3 2 3 4 1 1 1 2 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
(empty) |
Test 24
Group: 6, 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 5 3 4 3 5 3 3 5 5 4 5 5 5 5 2 ... |
correct output |
---|
YES 4 4 5 5 2 4 4 5 3 5 5 2 5 5 2 ... |
user output |
---|
(empty) |
Test 25
Group: 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 88 70 59 44 28 10 19 19 42 16 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
(empty) |
Test 26
Group: 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 31 72 52 30 77 56 79 10 88 11 ... |
correct output |
---|
YES 31 62 14 10 66 63 1 82 37 92 3... |
user output |
---|
(empty) |
Test 27
Group: 3, 4, 5, 6, 8
Verdict: ACCEPTED
input |
---|
1000 1 1 2 1 1 ... |
correct output |
---|
YES 1 YES 1 1 YES ... |
user output |
---|
YES 1 YES 1 1 YES ... Truncated |
Test 28
Group: 8
Verdict: ACCEPTED
input |
---|
1000 1 1 2 2 2 ... |
correct output |
---|
YES 1 YES 2 2 YES ... |
user output |
---|
YES 1 YES 2 2 YES ... Truncated |
Test 29
Group: 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 87 81 29 35 8 98 77 50 46 34 5... |
correct output |
---|
YES 34 74 25 91 80 18 95 26 88 12 ... |
user output |
---|
(empty) |
Test 30
Group: 8
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 100 65 92 39 22 67 41 17 65 97 71 ... |
correct output |
---|
YES 9 38 24 59 69 24 63 3 22 35 24... |
user output |
---|
(empty) |