public class RacerScore
{
static public class Segment
{
int id = -1;
int beg = 0;
int end = 0;
Segment(int i, int b, int e)
{
id = i;
beg = b;
end = e;
}
}
static public class comp implements Comparator
{
public int compare(Segment s1, Segment s2)
{
return s1.beg - s2.beg;
}
}
static public void getScores(Segment[] segs, int b, int e, HashMap<
Integer, Integer> mp, Segment[] tmp)
{
if (b >= e) // >= not <
return;
int mid = (b + e)/2;
getScores(segs, b, mid, mp, tmp);
getScores(segs, mid + 1, e, mp, tmp);
int lftIter = b;
int rgtIter = mid + 1;
int iter = 0;
while (lftIter <= mid || rgtIter <= e)
{
if (lftIter <= mid && (rgtIter > e || segs[lftIter].end < segs[
rgtIter].end))
{
if (!mp.containsKey(segs[lftIter].id))
mp.put(segs[lftIter].id, 0);
mp.put(segs[lftIter].id, mp.get(segs[lftIter].id) + rgtIter
- mid - 1);
tmp[iter++] = segs[lftIter++];
}
else
{
tmp[iter++] = segs[rgtIter++];
}
}
for (int i = 0; i <= e - b; i++)
segs[b + i] = tmp[i];
}
static public void printScore(Segment[] segs)
{
if (null == segs)
return;
Arrays.sort(segs, new comp());
HashMap map = new HashMap();
Segment[] tmp = new Segment[segs.length];
getScores(segs, 0, segs.length-1, map, tmp);
Iterator iter = map.keySet().iterator();
while (iter.hasNext())
{
int id = iter.next();
int num = map.get(id);
System.out.println(id + " " + num);
}
}
public static void main(String[] strs)
{
Segment[] segs = new Segment[10];
segs[0] = new Segment(0, 0, 4);
segs[1] = new Segment(1, 1, 3);
segs[2] = new Segment(2, 2, 3);
segs[3] = new Segment(3, 3, 12);
segs[4] = new Segment(4, 4, 6);
segs[5] = new Segment(5, 9, 14);
segs[6] = new Segment(6, 10, 44);
segs[7] = new Segment(7, 12, 32);
segs[8] = new Segment(8, 4, 7);
segs[9] = new Segment(9, 16, 24);
printScore(segs);
}
}