C# Number Of Disc Intersections
static long NumberOfDiscIntersections(int[] a)
{
long sum = 0;
long active = 0;
var c = a.Length;
var start = new int[c];
var end = new int[c];
for (int k = 0; k < c; k++)
{
var v = a[k];
var startKey = k < v ? 0 : k - v;
start[startKey]++;
var endKey = (long)k + v >= c ? c - 1 : k + v;
end[(int)endKey]++;
}
for (int k = 0; k < c; k++)
{
sum += active * start[k] + (long)start[k] * (start[k] - 1) / 2;
active += start[k] - end[k];
if (sum > 10000000)
{
return -1;
}
}
return sum;
}
This sorts disc start and end points and counts active overlaps without comparing every pair directly.