結果
問題 | No.270 next_permutation (1) |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:48:05 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 4,042 bytes |
コンパイル時間 | 314 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 677,052 KB |
最終ジャッジ日時 | 2025-03-26 15:49:24 |
合計ジャッジ時間 | 4,428 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 6 MLE * 1 -- * 8 |
ソースコード
def main():import sysinput = sys.stdin.read().split()ptr = 0N = int(input[ptr])ptr += 1K = int(input[ptr])ptr += 1p = list(map(int, input[ptr:ptr+N]))ptr += NB = list(map(int, input[ptr:ptr+N]))ptr += Nif K == 0:print(0)returndef initial_distance(p, B):return sum(abs(a - b) for a, b in zip(p, B))total = initial_distance(p, B)if K == 1:print(total)returnif N <= 12:# Find cyclefrom collections import OrderedDictseen = OrderedDict()current = p.copy()cycle = []key = tuple(current)while key not in seen:seen[key] = len(cycle)cycle.append(current.copy())# Generate next permutationi = N-2while i >=0 and current[i] >= current[i+1]:i -= 1if i == -1:current = current[::-1]else:j = N-1while current[j] <= current[i]:j -= 1current[i], current[j] = current[j], current[i]left = i+1right = N-1while left < right:current[left], current[right] = current[right], current[left]left +=1right -=1key = tuple(current)# Find where the cycle startsstart_idx = seen[key]cycle = cycle[start_idx:]# Precompute distancescycle_distances = [initial_distance(perm, B) for perm in cycle]cycle_length = len(cycle)# Compute totalif K <= start_idx:# All steps are before the cycleprint(sum(initial_distance(perm, B) for perm in seen.keys()[:K]))else:sum_before_cycle = sum(initial_distance(perm, B) for perm in list(seen.keys())[:start_idx])K -= start_idxfull_cycles = K // cycle_lengthremainder = K % cycle_lengthsum_cycle = sum(cycle_distances)total = sum_before_cycle + full_cycles * sum_cycle + sum(cycle_distances[:remainder])print(total)returnelse:current = p.copy()current_sum = initial_distance(current, B)total_sum = current_sumfor _ in range(K-1):# Generate next permutationi = N-2while i >= 0 and current[i] >= current[i+1]:i -= 1if i == -1:# Wrap around, all elements changeold = current.copy()current = current[::-1]# Update current_sumnew_sum = initial_distance(current, B)total_sum += new_sumcurrent_sum = new_sumelse:# Find jj = N-1while current[j] <= current[i]:j -= 1# Swap i and j# Update current_sumcurrent_sum -= abs(current[i] - B[i])current_sum -= abs(current[j] - B[j])current[i], current[j] = current[j], current[i]current_sum += abs(current[i] - B[i])current_sum += abs(current[j] - B[j])# Reverse from i+1 to endleft = i+1right = N-1while left < right:# Swap left and rightcurrent_sum -= abs(current[left] - B[left])current_sum -= abs(current[right] - B[right])current[left], current[right] = current[right], current[left]current_sum += abs(current[left] - B[left])current_sum += abs(current[right] - B[right])left += 1right -= 1total_sum += current_sumprint(total_sum)returnif __name__ == "__main__":main()