একটি ঘূর্ণনশীল দরজার জন্য অনুরোধের তালিকা দেওয়া আছে। প্রতিটি অনুরোধ [t, d] আকারে, যেখানে t = সময়, d = দিক (১ = ভিতর, ০ = বাইরে)। দরজা একবারে একজনের জন্য খোলা থাকে এবং ১ টাইম ইউনিট সময় লাগে।
নিয়মাবলী
- দরজা শুরুতে 'ভিতর' (1) অবস্থায় থাকে
- একই সময়ে একাধিক অনুরোধ থাকলে, আগে যারা আসে তিনি প্রথম পাবেন
- দিক konflikt হলে, আগের ব্যবহৃত দিকটি অগ্রাধিকার পাবে
- ১ টাইম ইউনিট কেউ ব্যবহার না করলে দরজা আবার 'ভিতর' অবস্থায় ফিরে যায়
উদাহরণ
ইনপুট: [[2,0],[3,1],[6,0],[6,1],[3,0]]
আউটপুট: [[2,0],[3,0],[4,1],[6,1],[7,0]]
C++ বাস্তবায়ন
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<vector<int>> solve(vector<vector<int>>& v) {
sort(v.begin(), v.end());
vector<vector<int>> ret;
int curr = 1, i = 0, n = v.size();
while (i < n) {
if (!ret.empty() && v[i][0] - ret.back()[0] > 1)
curr = 1;
int j = i + 1;
vector<int> arr(2, 0);
arr[v[i][1]]++;
while (j < n && v[j][0] == v[i][0]) {
arr[v[j][1]]++;
j++;
}
int t = max(ret.empty() ? 0 : ret.back()[0] + 1, v[i][0]);
if (arr[0] && arr[1]) {
while (arr[curr]--) {
ret.push_back({t, curr});
t++;
}
curr ^= 1;
while (arr[curr]--) {
ret.push_back({t, curr});
t++;
}
} else {
curr = v[i][1];
while (arr[curr]--) {
ret.push_back({t, curr});
t++;
}
}
curr = ret.back()[1];
i = j;
}
return ret;
}
};
মূল লজিক
একই টাইমস্ট্যাম্পের সব অনুরোধ একসাথে প্রক্রিয়া করা হয়। দুটি দিকের অনুরোধ থাকলে বর্তমান দিকের Anfrage-গুলো আগে প্রক্রিয়া করা হয়, তারপর অন্য দিকের।