改完以后,第 i 个探头的刻度必须是 s+(i−1)⋅d,起点 s 和公差 d 都是非负整数。对不上的探头付维修费,对上的不付。一组的最少费用,就是全部维修费之和,减去某个 (s,d) 上已经对上的探头费用之和的最大值。
每个维修费都是正数,所以选定一组 s,d 之后,凡是刻度已经落在这条等差数列上的探头都留下。做法是按 (d,s) 做哈希累加。
培养箱里从左到右装了一排探头。第 i 个探头现在的刻度是正整数 vi。可以把任意探头改成别的非负整数,改第 i 个需要付维修费 ci,不改就不付钱。
改完以后,整排刻度必须同时满足两条:
也就是说,存在两个非负整数:起点 s 和公差 d,使第 i 个探头的最终刻度正好是 s+(i−1)⋅d。请为每一组探头算出最少维修费。
第一行一个整数 q,表示巡检组数。
接下来 q 行,每行先是该组探头数 m,接着 m 个维修费 c1,c2,…,cm,再接着 m 个当前刻度 v1,v2,…,vm。
1≤q≤2×105
1≤m≤2×105
1≤vi≤m
1≤ci≤109
所有组的 m 加起来不超过 2×105。
维修费累加后可能超出 32 位有符号整数,计算时使用 64 位整数。
输出一行,共 q 个整数,依次是每组的最少维修费,相邻两个用一个空格分开。
输入
2
5 7 8 9 1 2 1 2 3 4 5
4 3 5 3 5 1 4 1 4
输出
0 6
说明
第一组已经是起点 1、公差 1 的刻度,不用改。
第二组改成 4,4,4,4:两个 1 都要改,费用 3+3=6。改成 1,1,1,1 要付 5+5=10,更贵。
输入
1
1 100 1
输出
0
说明
只有一个探头时,没有相邻差要满足,保持原刻度即可。
输入
1
3 4 10 1 3 1 2
输出
4
说明
取起点 0、公差 1,目标是 0,1,2。只有第一个探头从 3 改成 0,费用 4。后两个本来就是 1 和 2。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册