Official
A - サイコロの転がし操作 / Dice Rolling Operations Editorial
by
A - サイコロの転がし操作 / Dice Rolling Operations Editorial
by
kyopro_friends
問題文の指示通り、各ダイスの位置・上面・前面を管理しながら操作を行えば良いです。
各操作は \(O(1)\) で行えるため、計算量は \(O(N+Q)\) となります。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m, q;
cin >> n >> m >> q;
vector<array<int,3>> dice(n);
for(int i=0; i<n; i++) cin >> dice[i][0] >> dice[i][1] >> dice[i][2];
for(int i=0; i<q; i++){
int d;
char c;
cin >> d >> c;
d--;
auto[s, u, f] = dice[d];
if(c == '+'){
dice[d] = {s+1, 7-f, u};
}else{
dice[d] = {s-1, f, 7-u};
}
}
for(int i=0; i<n; i++){
cout << dice[i][0] << ' ' << dice[i][1] << endl;
}
}
実装例 (Python)
N, M, Q = map(int, input().split())
dice = []
for _ in range(N):
S, U, F = map(int, input().split())
dice.append((S, U, F))
for _ in range(Q):
d, c = input().split()
d = int(d)-1
S, U, F = dice[d]
if c == '+':
dice[d] = (S+1, 7-F, U)
else:
dice[d] = (S-1, F, 7-U)
for S, U, F in dice:
print(S, U)
