A.简单模拟。
B. 2 19 2^{19} 219爆搜,注意开 u l l ull ull。
C. 先用 n e x t _ p e r m u t a t i o n next\_permutation next_permutation找到第 k k k个排列,然后求出逆序对即可。
D. 并查集好题,先对区间按长度从小到大排序,然后用并查集维护,每个位置对应的答案。
code
class Solution {
public:
vector<int>s;
vector<int> xa;
int find(int x){
return s[x]==x?x:s[x]=find(s[x]);
}
int id(int x){
return lower_bound(xa.begin(),xa.end(),x) - xa.begin();
}
vector<int> minInterval(vector<vector<int>>& a, vector<int>& q) {
for(auto x:a) xa.push_back(x[0]),xa.push_back(x[1]);
for(auto x:q) xa.push_back(x);
sort(xa.begin(),xa.end());
xa.erase(unique(xa.begin(),xa.end()),xa.end());
sort(a.begin() , a.end() , [&](vector<int> &x, vector<int> &y){
return x[1]-x[0]<y[1]-y[0];
});
int n = xa.size();
s.resize(n+1);
vector<int> col(n+1,-1);
for(int i = 0 ; i < n+1 ; i++) {
s[i] = i;
}
for(auto x: a){
int l=id(x[0]), r= id(x[1]) ;
int len = x[1] - x[0] + 1;
while(find(l) <= r){
l = find(l);
col[l] = len;
s[l] = l + 1;
}
}
vector<int>ans;
for(int i = 0 ; i< q.size() ; i++){
ans.push_back(col[id(q[i])]);
}
return ans;
}
};