#CF2107F2. 骑行(困难版本)
骑行(困难版本)
每个测试时间限制:5 秒
每个测试内存限制:1024 兆字节
题目说明
这是该问题的困难版本。两个版本的区别在于,在此版本中 ,并且你需要为每个前缀输出答案。只有当你解决了该问题的所有版本时,才能进行 Hack。
Leo 在市中心做程序员,他的爱人在郊区的一所高中教书。每个周末,Leo 都会骑自行车去郊区与爱人共度美好周末。
此刻,Leo 前方的道路上共有 名骑行者在骑行。他们从前到后编号为 。初始时,Leo 位于第 名骑行者的后面。第 名骑行者有一个敏捷值 。
Leo 想要骑到第 名骑行者前面。Leo 可以无限次地执行以下操作:
- 假设 Leo 前方的第一个骑行者是 ,他可以花费 的成本骑到他前面。这会使他位于第 名骑行者之后(如果 ,则表示他已经位于第 名骑行者前面)。
- 使用他的超能力,花费 的成本交换 和 ()。
Leo 想知道骑到第 名骑行者前面的最小成本。
此外,他还想知道对于每个 ,以 作为原始数组时的答案。不同 的问题是相互独立的。具体来说,在第 个问题中,Leo 从第 名骑行者后面开始(而不是第 名后面),且编号为 的骑行者不存在。
输入格式
每个测试包含多个测试用例。
第一行包含一个整数 (),表示测试用例的数量。
接下来每个测试用例的格式如下:
- 第一行包含一个正整数 (),表示骑行者的数量。
- 第二行包含 个整数 ()。
数据保证所有测试用例的 之和不超过 。
输出格式
对于每个测试用例,输出 个整数,分别对应数组 的答案(),按顺序输出。
示例
输入
4
3
1 2 4
4
1 1 1 1
2
1 2
4
4 1 3 2
输出
1 3 7
1 2 3 4
1 3
4 3 6 8
样例解释
第一个测试用例:
一种可能的移动方式如下(针对 即完整数组):
- Leo 交换 ()和 (),数组变为 ,花费 。
- Leo 位于第 名骑行者后面,移动到第 名骑行者后面,花费 。
- Leo 交换 ()和 (),数组变为 ,花费 。
- Leo 位于第 名骑行者后面,移动到第 名骑行者后面,花费 。
- Leo 交换 ()和 (),数组变为 ,花费 。
- Leo 移动到第 名骑行者前面,花费 。
总成本为 。可以证明 是最小成本。
对于 :只有 ,Leo 直接在前面,成本 。
对于 :,一种最优策略是不交换,依次超车 和 ,成本 。
输出 。
第二个测试用例:
所有 ,对于前缀 ,依次超车成本 ,无需交换。输出 。