核心思路
质量互不相同,因此每个下标至多出现在一对 (u,v) 中。从左到右扫描数组,用哈希表记下已经出现过的质量及其下标。扫到下标 i 时,若 g−wi 曾出现在某个更早的下标 j,则 (j,i) 就是一对合法配对。由于 j 一定小于 i,自然满足 u<v。扫完后按 u 升序排序即可。
注意两点:先查表再把当前质量写入哈希表,这样 2wi=g 时不会把一件货和自己配对;配对完成的先后顺序是按较晚下标 v 出现的次序,不一定按 u 有序,必须再排一次。
也可以先按下标按质量排序,再双指针从两端向中间收。和为 g 时记录原下标(先换成 u<v),和偏小则左指针右移,和偏大则右指针左移。质量互不相同,指针各走一次即可。最后同样按 u 排序。两种做法复杂度同阶,下面代码采用哈希表。
冷链中转仓把月台前的货位排成一列,从靠近提升机的一端起按下标 0,1,2,… 编号。每个货位只放一件货,第 i 个货位的质量为 wi,且所有质量互不相同。今晚要发出一辆额定配重为 g 的冷藏车:调度员必须找出所有「两件货质量之和恰好等于 g」的货位下标对,方便叉车一次抱走。一对货位用较早的下标指向较晚的下标来记录;找不到任何一对时,结果是空的对照表。
给定长度 m 的质量序列与额定配重 g,请输出所有满足 wu+wv=g 且 u<v 的下标对。保证每个质量至多出现一次,因此每个下标最多出现在一对里。
约束:
第一行两个整数 m、g(1≤m≤1×105,−109≤g≤109),表示货位个数和额定配重。
第二行 m 个整数 w0,w1,…,wm−1(−109≤wi≤109),表示各货位质量,保证互不相同。
第一行一个整数 p,表示配成的对数。
随后 p 行,每行两个整数 u、v(u<v),表示一对货位下标。这些行必须按 u 从小到大输出。
输入
6 11
3 9 4 7 2 8
输出
3
0 5
1 4
2 3
说明
输入
5 -4
-1 3 -3 7 -7
输出
2
0 2
1 4
说明
两对分别是 (−1)+(−3) 与 3+(−7)。质量 7 没有能配上的另一件货。
输入
1 8
8
输出
0
说明
只有一个货位,无法配成两件,对照表为空。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册