I don’t think size is the issue, speed is more important. But even if you can use an unsorted list the speed shouldn’t be that bad. The list would only be accessed when a player logs on or is disconnected if you do not cull by time.
Since the list is unsorted you either add new entries at the beginning or end and remove the oldest entry from the other end. Rather than cull by time, which would require repeated regular iterations throught the list, I would just limit the list size so the oldest gets bumped off the far end of the list. If there is a server-side way of differentiating between a clean disconnect (client initiated) and a connection interuption of some sort (I imagine there is some sort of acking going on in the netcode), the list wouldn’t be filled by clean disconnects and should only contains true interuptions. Whenever a player connects, it could be compared fairly quickly against the entries in the list to see if it is a reconnect or new connection.
Could improve the speed some by using an array and replacing reloaded entries (which are removed) by the last in the ‘list’. This would make it so the last entry is not always the oldest, but I don’t think its a big deal. Kinda like a heap structure.
This assumes its just a matter of storing a mapping of the GUID to the XP value. There may be far more than that involved, however, so I am not saying its that simple. But I don’t think it calls for a more elaborate data structure. Haven’t really thought it all through as far as efficiency is concerned… 
Dawg