結果
| 問題 |
No.1867 Partitions and Inversions
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:40:50 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,308 bytes |
| コンパイル時間 | 166 ms |
| コンパイル使用メモリ | 82,420 KB |
| 実行使用メモリ | 171,256 KB |
| 最終ジャッジ日時 | 2025-06-12 21:45:00 |
| 合計ジャッジ時間 | 6,795 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | AC * 2 TLE * 1 -- * 62 |
ソースコード
def main():
import sys
input = sys.stdin.read().split()
n = int(input[0])
p = list(map(int, input[1:n+1]))
# 预处理每个区间的逆序数数目
S = [[0]*(n+1) for _ in range(n+1)]
for i in range(1, n+1):
cnt = 0
for j in range(i, n+1):
if j > i:
cnt += sum(1 for x in p[i-1:j] if x > p[j-1])
S[i][j] = cnt
# 计算总逆序数
total = 0
for i in range(n):
for j in range(i+1, n):
if p[i] > p[j]:
total += 1
# 动态规划
INF = -float('inf')
dp = [ [INF]*(n+1) for _ in range(n+1) ]
dp[0][0] = 0
for m in range(1, n+1):
for i in range(1, n+1):
for j in range(m-1, i):
if dp[m-1][j] != INF:
current = dp[m-1][j] + S[j+1][i]
if current > dp[m][i]:
dp[m][i] = current
# 计算答案
ans = []
for k in range(1, n+1):
max_sum = dp[k][n]
if max_sum == INF:
max_sum = 0
res = total - max_sum
ans.append(res)
# 处理k=1的情况
if n >= 1:
ans[0] = 0 # 因为k=1时总逆序数为0
for a in ans:
print(a)
if __name__ == "__main__":
main()
gew1fw