classRideSharingSystem:def__init__(self):self.t=0self.riders=SortedList()self.drivers=SortedList()self.d=defaultdict(int)defaddRider(self,riderId:int)->None:self.d[riderId]=self.tself.riders.add((self.t,riderId))self.t+=1defaddDriver(self,driverId:int)->None:self.drivers.add((self.t,driverId))self.t+=1defmatchDriverWithRider(self)->List[int]:iflen(self.riders)<1orlen(self.drivers)<1:return[-1,-1]return[self.drivers.pop(0)[1],self.riders.pop(0)[1]]defcancelRider(self,riderId:int)->None:self.riders.discard((self.d[riderId],riderId))# Your RideSharingSystem object will be instantiated and called as such:# obj = RideSharingSystem()# obj.addRider(riderId)# obj.addDriver(driverId)# param_3 = obj.matchDriverWithRider()# obj.cancelRider(riderId)
classRideSharingSystem{privateintt;privateTreeSet<int[]>riders;privateTreeSet<int[]>drivers;privateMap<Integer,Integer>d;publicRideSharingSystem(){this.t=0;this.riders=newTreeSet<>((a,b)->a[0]!=b[0]?Integer.compare(a[0],b[0]):Integer.compare(a[1],b[1]));this.drivers=newTreeSet<>((a,b)->a[0]!=b[0]?Integer.compare(a[0],b[0]):Integer.compare(a[1],b[1]));this.d=newHashMap<>();}publicvoidaddRider(intriderId){d.put(riderId,t);riders.add(newint[]{t,riderId});t++;}publicvoidaddDriver(intdriverId){drivers.add(newint[]{t,driverId});t++;}publicint[]matchDriverWithRider(){if(riders.isEmpty()||drivers.isEmpty()){returnnewint[]{-1,-1};}intdriverId=drivers.pollFirst()[1];intriderId=riders.pollFirst()[1];returnnewint[]{driverId,riderId};}publicvoidcancelRider(intriderId){Integertime=d.get(riderId);if(time!=null){riders.remove(newint[]{time,riderId});}}}/** * Your RideSharingSystem object will be instantiated and called as such: * RideSharingSystem obj = new RideSharingSystem(); * obj.addRider(riderId); * obj.addDriver(driverId); * int[] param_3 = obj.matchDriverWithRider(); * obj.cancelRider(riderId); */
classRideSharingSystem{private:intt;set<pair<int,int>>riders;set<pair<int,int>>drivers;unordered_map<int,int>d;public:RideSharingSystem(){t=0;}voidaddRider(intriderId){d[riderId]=t;riders.insert({t,riderId});t++;}voidaddDriver(intdriverId){drivers.insert({t,driverId});t++;}vector<int>matchDriverWithRider(){if(riders.empty()||drivers.empty()){return{-1,-1};}intdriverId=drivers.begin()->second;intriderId=riders.begin()->second;drivers.erase(drivers.begin());riders.erase(riders.begin());return{driverId,riderId};}voidcancelRider(intriderId){autoit=d.find(riderId);if(it!=d.end()){riders.erase({it->second,riderId});}}};/** * Your RideSharingSystem object will be instantiated and called as such: * RideSharingSystem* obj = new RideSharingSystem(); * obj->addRider(riderId); * obj->addDriver(driverId); * vector<int> param_3 = obj->matchDriverWithRider(); * obj->cancelRider(riderId); */
typeRideSharingSystemstruct{tintriders*redblacktree.Tree[int,int]drivers*redblacktree.Tree[int,int]dmap[int]int}funcConstructor()RideSharingSystem{returnRideSharingSystem{t:0,riders:redblacktree.New[int,int](),drivers:redblacktree.New[int,int](),d:make(map[int]int),}}func(this*RideSharingSystem)AddRider(riderIdint){this.d[riderId]=this.tthis.riders.Put(this.t,riderId)this.t++}func(this*RideSharingSystem)AddDriver(driverIdint){this.drivers.Put(this.t,driverId)this.t++}func(this*RideSharingSystem)MatchDriverWithRider()[]int{ifthis.riders.Empty()||this.drivers.Empty(){return[]int{-1,-1}}driverTime,driverId:=this.drivers.Left().Key,this.drivers.Left().ValueriderTime,riderId:=this.riders.Left().Key,this.riders.Left().Valuethis.drivers.Remove(driverTime)this.riders.Remove(riderTime)return[]int{driverId,riderId}}func(this*RideSharingSystem)CancelRider(riderIdint){time,exists:=this.d[riderId]if!exists{return}this.riders.Remove(time)}/** * Your RideSharingSystem object will be instantiated and called as such: * obj := Constructor(); * obj.AddRider(riderId); * obj.AddDriver(driverId); * param_3 := obj.MatchDriverWithRider(); * obj.CancelRider(riderId); */