考虑如何精确制造出 m 个谷值。
关键观察:如果我们让前一段序列严格递增,则从第 3 个位置开始,每个新元素都会形成一个谷值。 例如:
因此,只要在前面构造一个长度为 m+2 的严格递增段,就能制造出正好 m 个谷值。 接下来的数必须避免继续产生谷值,可以把剩余的数按严格递减顺序排列即可,因为这样不会超过前两个较大的数。
输入:n=5,m=2
适合 T 组数据,且总 ∑n≤2×105。
import sys
def solve():
data = sys.stdin.read().strip().split()
t = int(data[0])
idx = 1
out = []
for _ in range(t):
n = int(data[idx]); m = int(data[idx+1]); idx += 2
ans = []
# 前 m+2 个位置放 [n-m-1 .. n]
for x in range(n - m - 1, n + 1):
ans.append(x)
# 剩余放 [n-m-2 .. 1] 递减
for x in range(n - m - 2, 0, -1):
ans.append(x)
out.append(" ".join(map(str, ans)))
print("\n".join(out))
if __name__ == "__main__":
solve()
给定两个整数 n,m,请输出一个长度为 n 的排列 a1,a2,…,an,使得排列中 “谷值"的个数 恰好为 m 。定义:当 3≤i≤n 时,如果 max(ai−2,ai−1)≤ai ,则认为位置 i 形成一个"谷值”。
第一行一个整数 T(1≤T≤105),表示测试数据组数。
接下来每行两个整数 n,m(3≤n≤2×105,0≤m≤n−2) 。
每组的n之和不超过2×105
对于每组数据,输出一个长度为 n 的排列。若有多个解,输出任意一个。
输入
2
3 0
5 2
输出
1 2 3
3 4 5 2 1