結果
問題 | No.3062 Rotate and Maximize |
ユーザー |
👑 ![]() |
提出日時 | 2025-03-01 18:08:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 801 ms / 2,000 ms |
コード長 | 2,359 bytes |
コンパイル時間 | 331 ms |
コンパイル使用メモリ | 82,184 KB |
実行使用メモリ | 160,904 KB |
最終ジャッジ日時 | 2025-03-12 00:52:45 |
合計ジャッジ時間 | 22,078 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 51 |
ソースコード
"""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を破壊してはダメ---A登場しない数の制約をまじめに書いた Ver21 1を修正"""import sysfrom sys import stdinmod = 998244353N = int(stdin.readline())A = list(map(int,stdin.readline().split()))for i in range(N):A[i] -= 1if N-1 not in A:print (0)sys.exit()ks = []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):if len(C[na]) > 0: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)else:for pos in range(N):flag = Trueif M[pos] < na:flag = Falseif flag and pos != 0:D[na].append(pos)D[-1] = [0]E = [0] * Nans = 1for na in range(N-1,-1,-1):able = []for pos in D[na]:if E[pos] == 0:able.append(pos)ans *= len(able)ans %= modif able:E[able[0]] = 1print (ans * N % mod)