class SparseTable {
public:
vector<int>& data;
vector<vector<int>> st;
function<bool(int, int)> cmp;
SparseTable(vector<int>& data, function<bool(int, int)> cmp = less<int>{}):data(data), st(data.size(), vector<int>(log2(data.size()) + 1)), cmp(cmp) {
for (int i = 0; i < data.size(); i++) {
st[i][0] = i;
}
for (int j = 1; j < st[0].size(); j++) {
for (int i = 0; i < st.size(); i++) {
st[i][j] = st[i][j - 1];
int r = i + (1 << (j - 1));
if (r < data.size() and cmp(data[st[r][j - 1]], data[st[i][j]])) {
st[i][j] = st[r][j - 1];
}
}
}
}
int query(int l, int r) {
int d = log2(r - l + 1);
int L = st[l][d], R = st[r - (1 << d) + 1][d];
return cmp(data[R], data[L]) ? R : L;
}
};
class Solution {
public:
vector<int> mostCompetitive(vector<int>& nums, int k) {
SparseTable st(nums);
vector<int> ans;
int m = 0;
int l = 0;
while (m < k) {
int idx = st.query(l, nums.size() - k + m);
ans.push_back(nums[idx]);
l = idx + 1;
m++;
}
return ans;
}
};
c++ 稀疏表
最新推荐文章于 2024-08-17 23:59:05 发布