結果
問題 | No.3062 Rotate and Maximize |
ユーザー |
👑 ![]() |
提出日時 | 2025-03-01 17:54:41 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,159 bytes |
コンパイル時間 | 393 ms |
コンパイル使用メモリ | 82,408 KB |
実行使用メモリ | 85,212 KB |
最終ジャッジ日時 | 2025-03-12 00:52:23 |
合計ジャッジ時間 | 11,916 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 WA * 13 |
ソースコード
"""https://yukicoder.me/problems/12000まず、最大値の個数を見ると何回shiftするか分かる。元の位置はそのうちどれか最大から2番目の位置の集合を考えて、最大とペアリングすることを考える3番目と2番目の競合を考えると筋が悪いか?最大値の初位置ごとに考える?最大値の初期位置を決め撃つと、移動が一意に決まる---あ、最初のAは全部0なのか。すると P[0] = N として良くて、最後の答にN倍すればOKすると操作の内容もすべて決まるA[i] = max(P[a],P[b],P[c]...P[k]) みたいなのが決まる。xを置く位置を決めるとき、A[i]=x となる奴全てに影響できる位置である必要がある。また、他のAを破壊してはダメ---よくわからないけど22 2で4になってしまうのでそれを修正"""import sysfrom sys import stdinmod = 998244353N = int(stdin.readline())A = list(map(int,stdin.readline().split()))for i in range(N):A[i] -= 1ks = []for i in range(N):if A[i] == N-1:ks.append(i)# P[i]の取りうる最大値M = [N-1] * Nfor i in range(N):for k in ks:M[(i-k)%N] = min(M[(i-k)%N],A[i])# 置ける場所の候補を列挙adic = {}for i in range(N):if A[i] not in adic:adic[A[i]] = 0adic[A[i]] += 1C = [ {} for i in range(N) ]for i in range(N):for k in ks:if (i-k)%N not in C[A[i]]:C[A[i]][(i-k)%N] = 0C[A[i]][(i-k)%N] += 1D = [ [] for i in range(N) ]for na in range(N):for pos in C[na]:flag = Trueif C[na][pos] != adic[na]:flag = Falseif M[pos] < na:flag = Falseif flag and pos != 0:D[na].append(pos)D[-1] = [0]exist = set()for na in range(N):for x in D[na]:exist.add(x)ans = 1free = N - len(exist)for na in range(N-1,-1,-1):if na not in adic:ans *= freefree -= 1ans %= modelse:ans *= len(D[na])free += len(D[na])-1ans %= modprint (ans * N % mod)