Official

A - サイコロの転がし操作 / Dice Rolling Operations Editorial by kyopro_friends Editorial for printing


問題文の指示通り、各ダイスの位置・上面・前面を管理しながら操作を行えば良いです。

各操作は \(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)

posted:
last update: