/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static int countValidPairs(int[] arr, int target) {
int n = arr.length;
// Split into positive, negative, and zero buckets
List<Integer> pos = new ArrayList<>();
List<Integer> neg = new ArrayList<>();
int zeroCount = 0;
for (int x : arr) {
if (x > 0) pos.add(x);
else if (x < 0) neg.add(x);
else zeroCount++;
}
Collections.
sort(neg
); // will be increasing (more negative to less negative)
int count = 0;
// ---------- Case 1: Both non-negative ----------
if (target % 2 == 0) {
int half = target / 2;
int freqHalf = 0;
for (int x : pos) {
if (x == half) freqHalf++;
}
if (zeroCount > 0 && half == 0) freqHalf += zeroCount; // include zeros
// All pairs (half, half)
count += (freqHalf * (freqHalf - 1)) / 2;
}
// ---------- Case 2: Both negative ----------
if (target % 2 == 0) {
int half = -target / 2;
int freqHalf = 0;
for (int x : neg) {
if (x == half) freqHalf++;
}
// All pairs (half, half)
count += (freqHalf * (freqHalf - 1)) / 2;
}
// ---------- Case 3: One positive, one negative ----------
if (target % 2 == 0) {
int half = target / 2;
// Positive side: a[i] = half
int freqHalfPos = 0;
for (int x : pos) if (x == half) freqHalfPos++;
// Negative side: |a[j]| <= half
int validNeg = 0;
for (int x
: neg
) if (Math.
abs(x
) <= half
) validNeg
++;
count += freqHalfPos * validNeg;
// Negative side: a[j] = -half
int freqHalfNeg = 0;
for (int x : neg) if (x == -half) freqHalfNeg++;
// Positive side: |a[i]| < half
int validPos = 0;
for (int x
: pos
) if (Math.
abs(x
) < half
) validPos
++;
count += freqHalfNeg * validPos;
}
// ---------- Case 4: One negative, one non-negative ----------
// Already covered in Case 3 (since unordered pairs handled once)
return count;
}
// Driver code
public static void main
(String[] args
) { int[] arr = {2, -2, 4, -4, 3, -3, 0, 0};
int target = 6;
int result = countValidPairs(arr, target);
System.
out.
println("Number of valid unordered pairs: " + result
); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50VmFsaWRQYWlycyhpbnRbXSBhcnIsIGludCB0YXJnZXQpIHsKICAgICAgICBpbnQgbiA9IGFyci5sZW5ndGg7CgogICAgICAgIC8vIFNwbGl0IGludG8gcG9zaXRpdmUsIG5lZ2F0aXZlLCBhbmQgemVybyBidWNrZXRzCiAgICAgICAgTGlzdDxJbnRlZ2VyPiBwb3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBMaXN0PEludGVnZXI+IG5lZyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGludCB6ZXJvQ291bnQgPSAwOwoKICAgICAgICBmb3IgKGludCB4IDogYXJyKSB7CiAgICAgICAgICAgIGlmICh4ID4gMCkgcG9zLmFkZCh4KTsKICAgICAgICAgICAgZWxzZSBpZiAoeCA8IDApIG5lZy5hZGQoeCk7CiAgICAgICAgICAgIGVsc2UgemVyb0NvdW50Kys7CiAgICAgICAgfQoKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHBvcyk7CiAgICAgICAgQ29sbGVjdGlvbnMuc29ydChuZWcpOyAvLyB3aWxsIGJlIGluY3JlYXNpbmcgKG1vcmUgbmVnYXRpdmUgdG8gbGVzcyBuZWdhdGl2ZSkKCiAgICAgICAgaW50IGNvdW50ID0gMDsKCiAgICAgICAgLy8gLS0tLS0tLS0tLSBDYXNlIDE6IEJvdGggbm9uLW5lZ2F0aXZlIC0tLS0tLS0tLS0KICAgICAgICBpZiAodGFyZ2V0ICUgMiA9PSAwKSB7CiAgICAgICAgICAgIGludCBoYWxmID0gdGFyZ2V0IC8gMjsKICAgICAgICAgICAgaW50IGZyZXFIYWxmID0gMDsKCiAgICAgICAgICAgIGZvciAoaW50IHggOiBwb3MpIHsKICAgICAgICAgICAgICAgIGlmICh4ID09IGhhbGYpIGZyZXFIYWxmKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHplcm9Db3VudCA+IDAgJiYgaGFsZiA9PSAwKSBmcmVxSGFsZiArPSB6ZXJvQ291bnQ7IC8vIGluY2x1ZGUgemVyb3MKCiAgICAgICAgICAgIC8vIEFsbCBwYWlycyAoaGFsZiwgaGFsZikKICAgICAgICAgICAgY291bnQgKz0gKGZyZXFIYWxmICogKGZyZXFIYWxmIC0gMSkpIC8gMjsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tLS0tLS0gQ2FzZSAyOiBCb3RoIG5lZ2F0aXZlIC0tLS0tLS0tLS0KICAgICAgICBpZiAodGFyZ2V0ICUgMiA9PSAwKSB7CiAgICAgICAgICAgIGludCBoYWxmID0gLXRhcmdldCAvIDI7CiAgICAgICAgICAgIGludCBmcmVxSGFsZiA9IDA7CgogICAgICAgICAgICBmb3IgKGludCB4IDogbmVnKSB7CiAgICAgICAgICAgICAgICBpZiAoeCA9PSBoYWxmKSBmcmVxSGFsZisrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBBbGwgcGFpcnMgKGhhbGYsIGhhbGYpCiAgICAgICAgICAgIGNvdW50ICs9IChmcmVxSGFsZiAqIChmcmVxSGFsZiAtIDEpKSAvIDI7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLS0tLS0tIENhc2UgMzogT25lIHBvc2l0aXZlLCBvbmUgbmVnYXRpdmUgLS0tLS0tLS0tLQogICAgICAgIGlmICh0YXJnZXQgJSAyID09IDApIHsKICAgICAgICAgICAgaW50IGhhbGYgPSB0YXJnZXQgLyAyOwoKICAgICAgICAgICAgLy8gUG9zaXRpdmUgc2lkZTogYVtpXSA9IGhhbGYKICAgICAgICAgICAgaW50IGZyZXFIYWxmUG9zID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgeCA6IHBvcykgaWYgKHggPT0gaGFsZikgZnJlcUhhbGZQb3MrKzsKCiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHNpZGU6IHxhW2pdfCA8PSBoYWxmCiAgICAgICAgICAgIGludCB2YWxpZE5lZyA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IHggOiBuZWcpIGlmIChNYXRoLmFicyh4KSA8PSBoYWxmKSB2YWxpZE5lZysrOwoKICAgICAgICAgICAgY291bnQgKz0gZnJlcUhhbGZQb3MgKiB2YWxpZE5lZzsKCiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHNpZGU6IGFbal0gPSAtaGFsZgogICAgICAgICAgICBpbnQgZnJlcUhhbGZOZWcgPSAwOwogICAgICAgICAgICBmb3IgKGludCB4IDogbmVnKSBpZiAoeCA9PSAtaGFsZikgZnJlcUhhbGZOZWcrKzsKCiAgICAgICAgICAgIC8vIFBvc2l0aXZlIHNpZGU6IHxhW2ldfCA8IGhhbGYKICAgICAgICAgICAgaW50IHZhbGlkUG9zID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgeCA6IHBvcykgaWYgKE1hdGguYWJzKHgpIDwgaGFsZikgdmFsaWRQb3MrKzsKCiAgICAgICAgICAgIGNvdW50ICs9IGZyZXFIYWxmTmVnICogdmFsaWRQb3M7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLS0tLS0tIENhc2UgNDogT25lIG5lZ2F0aXZlLCBvbmUgbm9uLW5lZ2F0aXZlIC0tLS0tLS0tLS0KICAgICAgICAvLyBBbHJlYWR5IGNvdmVyZWQgaW4gQ2FzZSAzIChzaW5jZSB1bm9yZGVyZWQgcGFpcnMgaGFuZGxlZCBvbmNlKQoKICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9CgogICAgLy8gRHJpdmVyIGNvZGUKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBpbnRbXSBhcnIgPSB7MiwgLTIsIDQsIC00LCAzLCAtMywgMCwgMH07CiAgICAgICAgaW50IHRhcmdldCA9IDY7CgogICAgICAgIGludCByZXN1bHQgPSBjb3VudFZhbGlkUGFpcnMoYXJyLCB0YXJnZXQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHZhbGlkIHVub3JkZXJlZCBwYWlyczogIiArIHJlc3VsdCk7CiAgICB9Cn0=