Untitled
unknown
plain_text
a year ago
2.4 kB
10
Indexable
ll n; cin>>n; // 0 -> entry , 1 -> exit vector<pair<ll,ll>> a(n); queue<pair<ll,ll>> q0 , q1; forsn(i,0,n) cin>>a[i].f; ll k ; cin>>k; for(ll i=0;i<n;i++){ cin>>a[i].s; if(!a[i].s) q0.push({a[i].f,i}); else q1.push({a[i].f,i}); } vector<ll> ans(n,0); ll curr = 0; ll dr = 1; // dr = 1 means exit is in preference , else entry while((!q1.empty()) || (!q0.empty())){ if(q1.empty()){ ll time = q0.front().f , i = q0.front().s; q0.pop(); curr = max(curr,time); ans[i] = curr; curr++; } else if(q0.empty()){ ll time = q1.front().f , i = q1.front().s; q1.pop(); curr = max(curr,time); ans[i] = curr; curr++; } else{ ll time0=q0.front().f , i = q0.front().s , time1= q1.front().f , j = q1.front().s; time0 = max(time0,curr) , time1 = max(time1,curr); if(time0 == time1){ // checking if they reached gate at same time if(time0-curr >= 1) dr = 1; // checking if difference exceeds by 1 , then preference goes to exit curr = max(curr,time0); if(dr){ q1.pop(); ans[j] = curr; curr++; } else{ q0.pop(),ans[i] = curr; curr++; } } else if(time1 < time0){ // else which comes first , goes first curr = max(curr,time1); ans[j] = curr; curr++; dr = 1; q1.pop(); } else{ curr = max(curr,time0); q0.pop(); ans[i] = curr ; curr++; dr = 0; } } } for(auto i : ans){ cout<<i<<ln; }
Editor is loading...
Leave a Comment