voidsolve(vector<int>& nums){ int size = nums.size(); for (int j = 0; j < 2; j++) { for (int i = 0; i < size; i++) { nums.push_back(nums[i]); } } int left = 0, right = 0; deque<int> q; // we need to always keep the largest value, from left to right // we should use monotonic stack, but since we need to deque from // front, so deque serve our need better while (left < size) { while ((q.empty() || 2 * nums[right] >= q.front()) && right < nums.size()) { while (!q.empty() && nums[right] > q.back()) { q.pop_back(); } q.push_back(nums[right]); right++; } int res = (right == nums.size()) ? -1 : right - left; out << res << " "; if (q.front() == nums[left]) { q.pop_front(); } left++; } out << endl; }
intmain(){ int n; in >> n; vector<int> nums; for (int i = 0; i < n; i++) { int num; in >> num; nums.push_back(num); } solve(nums); return0; }