package main import . "fmt" import . "os" import bf "bufio" import . "sort" func main() { rd := bf.NewReader(Stdin) var t int Fscan(rd, &t) for ; t > 0; t-- { var n int Fscan(rd, &n) a := make([]int, n) for i := range a { Fscan(rd, &a[i]) } ans := solve(n, a) Println(ans) } } func solve(n int, a []int) int { // Aの各要素をノードとして移動をエッジとした最小全域木を作ればよい? // Aが正のノード同士の移動は正の最小Aと正の最大Aのエッジが最大の正のXを形成する(他の正のノードは正の最大Aを経由して移動) // Aが負のノード同士の移動は負の最小Aと負の最大Aのエッジが最大の正のXを形成する(他の負のノードは負の最小Aを経由して移動) // Aに0が含まれない場合の正のノードと負のノードの移動は正の最小Aと負の最大Aのエッジが最大の負のXを形成する // Aに0が含まれる場合は、Xは0(すべてのノードは0のノードを経由して移動) ps := make([]int, 0, n) ms := make([]int, 0, n) zc := 0 for _, v := range a { switch { case v < 0: ms = append(ms, v) case v > 0: ps = append(ps, v) case v == 0: zc++ } } Ints(ps) Ints(ms) if zc > 0 { return 0 } if len(ps) > 0 && len(ms) > 0 { return ps[0]*ms[len(ms)-1] } if len(ps) > 0 { return ps[0]*ps[len(ps)-1] } else { return ms[0]*ms[len(ms)-1] } }