classSolution{public:vector<int>timeTaken(vector<int>&arrival,vector<int>&state){constintn=arrival.size();vector<int>ans(n);vector<queue<int>>qs(2);// qs[0] := enter queue, qs[1] := exit queueinttime=0;intd=1;// 0 := enter, 1 := exitfor(inti=0;i<n;++i){popQueues(time,d,arrival[i],qs,ans);// If the door was not used in the previous second, then the person who// wants to exit goes first.if(arrival[i]>time){time=arrival[i];// Forward `time` to now.d=1;}qs[state[i]].push(i);}popQueues(time,d,200'000,qs,ans);returnans;}private:voidpopQueues(int&time,int&d,intarrivalTime,vector<queue<int>>&qs,vector<int>&ans){while(arrivalTime>time&&(!qs[0].empty()||!qs[1].empty())){if(qs[d].empty())d^=1;ans[qs[d].front()]=time++,qs[d].pop();}}};
classSolution{publicint[]timeTaken(int[]arrival,int[]state){finalintn=arrival.length;int[]ans=newint[n];Queue<Integer>[]qs=newQueue[2];qs[0]=newLinkedList<>();// enter queueqs[1]=newLinkedList<>();// exit queuefor(inti=0;i<n;++i){popQueues(arrival[i],qs,ans);// If the door was not used in the previous second, then the person who// wants to exit goes first.if(arrival[i]>time){time=arrival[i];// Forward `time` to now.d=1;// Reset priority to exit.}qs[state[i]].offer(i);}popQueues(200000,qs,ans);returnans;}privateinttime=0;privateintd=1;// 0: enter, 1: exitprivatevoidpopQueues(intarrivalTime,Queue<Integer>[]qs,int[]ans){while(arrivalTime>time&&(!qs[0].isEmpty()||!qs[1].isEmpty())){if(qs[d].isEmpty())d^=1;// Toggle between enter (0) and exit (1)ans[qs[d].poll()]=time++;}}}
Thanks for stopping by! If you find this site helpful, consider buying me some protein powder to keep me fueled! π