LeetCode第239场周赛(康复训练)

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;
    }
};