結果
問題 | No.270 next_permutation (1) |
ユーザー |
![]() |
提出日時 | 2017-05-05 12:05:40 |
言語 | Python2 (2.7.18) |
結果 |
AC
|
実行時間 | 131 ms / 2,000 ms |
コード長 | 3,449 bytes |
コンパイル時間 | 173 ms |
コンパイル使用メモリ | 7,168 KB |
実行使用メモリ | 18,700 KB |
最終ジャッジ日時 | 2024-09-14 08:40:46 |
合計ジャッジ時間 | 1,736 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 15 |
ソースコード
import sysdef solve():def count(flv, lv, num, nth):q, r = divmod(nth, facts[flv])if flv == lv:ret = (q > num) * facts[flv]if q == num:ret += relse:ret = (q - (q > num)) * facts[flv - 1]if q != num:ret += count(flv - 1, lv, num - (q < num), r)return retdef counts(n, target, nth):counts = [0] * ncnt = 0for i in range(n - 1, -1, -1):q, nth = divmod(nth, facts[i])counts[i] = cnt + (q > target) * facts[i] + (q == target) * nthcnt += (q - (q > target)) * facts[i - 1]if q == target:for j in range(i - 1, -1, -1):counts[j] = cntbreaktarget -= (q < target)return counts[::-1]def next_permutation(seq):N = len(seq)for i in range(N - 1, 0, -1):if seq[i - 1] < seq[i]:j = N - 1while seq[j] <= seq[i - 1]:j -= 1seq[i - 1], seq[j] = seq[j], seq[i - 1]seq[i:] = seq[i:][::-1]breakelse:seq[:] = seq[::-1]return Falsereturn Truedef permutation_rank(n, seq):def add(idx, v):while idx <= n:fenwick[idx] += vidx += idx & -idxreturndef read(idx):ret = 0while idx > 0:ret += fenwick[idx]idx &= idx - 1return retif n == 0:return 0fenwick = [0] * (n + 1)for i in range(2, n + 1):add(i, 1)ret = 0for i, c in enumerate(seq):ret += read(c + 1) * facts[n - 1 - i]add(c + 1, -1)return retF = 20facts = [1] * (F + 1)for i in range(1, F + 1):facts[i] = facts[i - 1] * iinput = sys.stdin.readlinewhile 1:try:N, K = map(int, input().split())except:breakA = [c - 1 for c in map(int, input().split())]B = [c - 1 for c in map(int, input().split())]def fast_sum(N, K, base, B):ret = 0for j in range(N):for i, c in enumerate(counts(N, j, K)):ret += abs(B[i] - base[j]) * creturn retans = 0if N <= F:q, K = divmod(K, facts[N])s = 0for i in range(N):for j in range(N):s += abs(B[i] - j)s *= facts[N - 1]ans += q * srank = permutation_rank(N, A)base = list(range(N))if rank + K > facts[N]:ans += sans += fast_sum(N, rank + K - facts[N], base, B)ans -= fast_sum(N, rank, base, B)else:ans += fast_sum(N, rank + K, base, B)ans -= fast_sum(N, rank, base, B)else:last = A[-F:]base = sorted(last)conv = {l: i for i, l in enumerate(base)}rank = permutation_rank(F, [conv[p] for p in last])if rank + K > facts[F]:s = 0for i in range(N - F):s += abs(B[i] - A[i])ans += s * (facts[F] - rank)ans += fast_sum(F, facts[F], base, B[-F:])ans -= fast_sum(F, rank, base, B[-F:])A = A[:-F] + base[::-1]next_permutation(A)ans += fast_sum(F, rank + K - facts[F], sorted(A[-F:]), B[-F:])s = 0for i in range(N - F):s += abs(B[i] - A[i])ans += s * (rank + K - facts[F])else:ans += fast_sum(F, rank + K, base, B[-F:])ans -= fast_sum(F, rank, base, B[-F:])s = 0for i in range(N - F):s += abs(B[i] - A[i])ans += s * Kprint(ans)solve()