CSES - NOI 2024 - Results
Submission details
Task:Chair Game
Sender:Teo Lovmar
Submission time:2024-03-20 15:25:49 +0200
Language:C++ (C++11)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED8
#2ACCEPTED5
#3ACCEPTED4
#4ACCEPTED7
#5ACCEPTED12
#6ACCEPTED15
#7ACCEPTED20
#8ACCEPTED29
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 7, 8details
#2ACCEPTED0.00 s1, 7, 8details
#3ACCEPTED0.01 s1, 7, 8details
#4ACCEPTED0.01 s1, 7, 8details
#5ACCEPTED0.01 s1, 7, 8details
#6ACCEPTED0.01 s7, 8details
#7ACCEPTED0.01 s7, 8details
#8ACCEPTED0.03 s2, 8details
#9ACCEPTED0.01 s3, 4, 5, 6, 8details
#10ACCEPTED0.01 s3, 4, 5, 6, 8details
#11ACCEPTED0.01 s3, 4, 5, 6, 8details
#12ACCEPTED0.07 s3, 4, 5, 6, 8details
#13ACCEPTED0.01 s4, 5, 6, 7, 8details
#14ACCEPTED0.02 s4, 5, 6, 8details
#15ACCEPTED0.01 s4, 5, 6, 8details
#16ACCEPTED0.04 s4, 5, 6, 8details
#17ACCEPTED0.01 s5, 6, 7, 8details
#18ACCEPTED0.01 s5, 6, 8details
#19ACCEPTED0.01 s5, 6, 8details
#20ACCEPTED0.05 s5, 6, 8details
#21ACCEPTED0.00 s1, 6, 7, 8details
#22ACCEPTED0.01 s6, 7, 8details
#23ACCEPTED0.01 s6, 8details
#24ACCEPTED0.06 s6, 8details
#25ACCEPTED0.01 s8details
#26ACCEPTED0.14 s8details
#27ACCEPTED0.01 s3, 4, 5, 6, 8details
#28ACCEPTED0.01 s8details
#29ACCEPTED0.13 s8details
#30ACCEPTED0.13 s8details

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define fi first
#define se second
 
// https://www.ams.org/journals/proc/1952-003-04/S0002-9939-1952-0050579-7/S0002-9939-1952-0050579-7.pdf
void test() {
  ll n;
  cin >> n;
 
  // a: Ursprungsplatsen. Fixerat WLOG till a_i = i för alla i = 1, ..., n
  // b: Flyttningslängden för person som börjar på plats i (en permutation av b
  //    är given av uppgiften)
  // c: De nya placeringarna. Beräknas av b_i = c_i - a_i
  //
  // Vi letar då en möjlig permutation av b sådan att alla c_i är unika, med
  // andra ord att alla deltagarna får en unik sittplats efter omflyttningen
  //
  // Av beräkningsmässiga skäl håller har vi en reverse-lookup för a. Alltså så
  // att vi snabbt kan hitta index för ett specifikt värde av a
  vector<ll> b_perm, a, b, c, a_rev;
  b_perm.resize(n);
 
  ll b_sum = 0;
  for (ll i = 0; i < n; i++) {
    cin >> b_perm[i];
    b_sum += b_perm[i];
  }
 
  // Enligt artikeln är permutationen möjlig precis då sum(b) = 0 (mod n).
  // Eftersom b_perm endast är en permutation av b (vilket inte ändrar summan)
  // räcker det med att ta sum(b_perm)
  if (b_sum % n != 0) {
    cout << "NO\n";
    return;
  }
 
  // Vi återuppbygger ordningen på b_i induktionsmässigt. Från början sätter vi
  // b_i till 0 (och följdaktiligen c_i = a_i). Detta, läget är självfallet
  // godkänt, men b är inte en permutation av b_perm. Detta måste återgärdas
  a.resize(n);
  a_rev.resize(n);
  b.resize(n);
  c.resize(n);
  for (ll i = 0; i < n; i++) {
    a[i] = i;
    a_rev[i] = i;
    b[i] = 0;
    c[i] = i;
  }
 
  for (ll i = 0; i < n - 1; i++) {
    // Introducera ett nytt b värde, men kompensera alltid genom att lägga till
    // dess additativa invers i slutet av b, b[n-1] agerar då som en restterm
    ll ind = distance(b.begin(), find(b.begin(), b.end(), 0));
    b[ind] = b_perm[i];
    b[n - 1] = (n + b[n - 1] - b[ind]) % n;
 
    // Därefter måste vi se till att a_i och c_i faktiskt överrensstämmer med
    // b_i. Alltså att a_i + b_i = c_i uppfylls. Eftersom alla andra kolumner
    // och de enda vi ändrat är b[i] och b[n-1] sker det precis då b[i] stämmer
    while ((a[ind] + b[ind]) % n != c[ind]) {
      // Är det möjligt att godgöra vilkoren med endast platsbyte inom de
      // modifierade kolumnerna?
      if ((a[ind] + b[ind]) % n == c[n - 1])
        swap(c[ind], c[n - 1]);
      else if ((a[ind] + b[n - 1]) % n == c[ind]) {
        swap(a[ind], a[n - 1]);
        swap(a_rev[a[ind]], a_rev[a[n - 1]]);
        swap(c[ind], c[n - 1]);
      } else if ((a[ind] + b[n - 1]) % n == c[n - 1]) {
        swap(a[ind], a[n - 1]);
        swap(a_rev[a[ind]], a_rev[a[n - 1]]);
      } else {
        // Nej? testa igen
        ll new_a = a_rev[(n + c[ind] - b[ind]) % n];
        swap(b[ind], b[new_a]);
        swap(c[ind], c[new_a]);
        swap(c[ind], c[n - 1]);
      }
    }
  }

  vector<ll> ans;
  ans.resize(n);
  for (ll i = 0; i < n; i++) {
    if (b[i] == 0) b[i] = n;
    ans[a[i]] = b[i];
  }

  cout << "YES\n";
  for (ll i = 0; i < n; i++) {
    cout << ans[i] << " ";
  }
 
  cout << '\n';
}
 
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
 
  ll t;
  cin >> t;
  for (ll i = 0; i < t; i++) {
    test();
  }
 
  return 0;
}

Test details

Test 1

Group: 1, 7, 8

Verdict: ACCEPTED

input
637
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

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
1 1 1 1 1 1 2 8 
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
8 2 2 6 2 5 1 6 
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
3 7 2 7 2 8 1 2 
YES
4 5 3 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
2 16 4 13 8 6 8 16 2 11 5 2 9 ...
Truncated

Test 8

Group: 2, 8

Verdict: ACCEPTED

input
1000
1
1
2
1 2
...

correct output
YES

NO
YES
3 1 2 
...

user output
YES

NO
YES
3 1 2 
...
Truncated

Test 9

Group: 3, 4, 5, 6, 8

Verdict: ACCEPTED

input
988
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

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

YES
1 1 
YES
...

user output
YES

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

YES
1 1 
YES
...

user output
YES

YES
1 1 
YES
...
Truncated

Test 14

Group: 4, 5, 6, 8

Verdict: ACCEPTED

input
979
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

YES
1 1 
YES
...
Truncated

Test 15

Group: 4, 5, 6, 8

Verdict: ACCEPTED

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
NO
NO
NO
NO
NO
...
Truncated

Test 16

Group: 4, 5, 6, 8

Verdict: ACCEPTED

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
YES
3 1 3 1 2 3 1 2 3 1 2 3 1 2 3 ...
Truncated

Test 17

Group: 5, 6, 7, 8

Verdict: ACCEPTED

input
980
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

YES
1 1 
YES
...
Truncated

Test 18

Group: 5, 6, 8

Verdict: ACCEPTED

input
947
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

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: ACCEPTED

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
YES
2 4 4 1 3 4 2 4 2 3 3 4 2 4 2 ...
Truncated

Test 21

Group: 1, 6, 7, 8

Verdict: ACCEPTED

input
715
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

YES
1 1 
YES
...
Truncated

Test 22

Group: 6, 7, 8

Verdict: ACCEPTED

input
843
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

YES
1 1 
YES
...
Truncated

Test 23

Group: 6, 8

Verdict: ACCEPTED

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
NO
NO
NO
NO
NO
...
Truncated

Test 24

Group: 6, 8

Verdict: ACCEPTED

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
YES
4 4 5 3 5 3 4 4 5 5 2 5 3 4 4 ...
Truncated

Test 25

Group: 8

Verdict: ACCEPTED

input
1000
100
88 70 59 44 28 10 19 19 42 16 ...

correct output
NO
NO
NO
NO
NO
...

user output
NO
NO
NO
NO
NO
...
Truncated

Test 26

Group: 8

Verdict: ACCEPTED

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
YES
39 64 67 6 98 50 27 78 66 18 2...
Truncated

Test 27

Group: 3, 4, 5, 6, 8

Verdict: ACCEPTED

input
1000
1
1
2
1 1
...

correct output
YES

YES
1 1 
YES
...

user output
YES

YES
1 1 
YES
...
Truncated

Test 28

Group: 8

Verdict: ACCEPTED

input
1000
1
1
2
2 2
...

correct output
YES

YES
2 2 
YES
...

user output
YES

YES
2 2 
YES
...
Truncated

Test 29

Group: 8

Verdict: ACCEPTED

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
YES
32 14 24 48 77 52 65 66 14 86 ...
Truncated

Test 30

Group: 8

Verdict: ACCEPTED

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
YES
52 100 98 64 20 53 25 9 76 60 ...
Truncated