【2022-05-28-第79场双周赛】复盘

总结

Q4数据比较弱,所以没写完整的线段树也能过(听说有的语言暴力也能过?)

Q1.判断一个数的数字计数是否等于数位的值

RATING:1253

比较绕,直接模拟。

class Solution {
public:
    bool digitCount(string num) {
        int h[10] = {0};
        for(auto c : num) h[c - '0']++;
        for(int i = 0; i < num.size(); ++i) if(h[i] != (num[i] - '0')) return false;
        return true;
    }
};

Q2.最多单词数的发件人

RATING:1347

哈希模拟。

class Solution {
public:
    string largestWordCount(vector<string>& m, vector<string>& s) {
        unordered_map<string, int> mp;
        int n = m.size();
        for(int i = 0 ; i < n; ++i){
            int t = 0;
            for(auto &c : m[i]) if(c == ' ') ++t;
            mp[s[i]] += t + 1;
        }
        string res = "";
        int mx = 0;
        for(auto &i : mp){
            if(i.second > mx){
                mx = i.second;
                res = i.first;
            }
            else if(i.second == mx && i.first > res) res = i.first;
        }
        return res;
    }
};

Q3.道路的最大总重要性

RATING:1496

大权值给度大的点。

class Solution {
public:
    int d[50010] = {0};
    long long ret = 0;
    long long maximumImportance(int n, vector<vector<int>>& r) {
        for(auto &e : r) ++d[e[0]], ++d[e[1]];
        sort(d, d + n);
        for(int i = 0 ; i < n; ++i) ret += (long long)(i + 1) * d[i];
        return ret;
    }
};

Q4.以组为单位订音乐会的门票

RATING:2470

用线段树维护每行预定数,进行查找插入等。

static const int io = []() {
    std::ios::sync_with_stdio(0);
    cin.tie(0);
    return 0;
}();
class BookMyShow {
public:
    int n, m;
    int a[50010] = {0}, mi[200010] = {0};
    long long f[200010] = {0};
    
    void push_up(int k){
        mi[k] = min(mi[k * 2], mi[k * 2 + 1]);
    }
    
    void buildTree(int k, int l, int r){
        if(l == r){
            f[k] = a[l];
            return ;
        }
        int mid = (l + r) >> 1;
        buildTree(k + k, l, mid);
        buildTree(k + k + 1, mid + 1, r);
        f[k] = f[k + k] + f[k + k + 1];
    }
    
    int getmi(int k, int l, int r, int x, int y){
        if(l == x && r == y) return mi[k];
        int mid = l + r >> 1;
        if(y <= mid) return getmi(k + k, l , mid, x, y);
        else if(x > mid) return getmi(k + k + 1, mid + 1, r, x, y);
        else return min(getmi(k + k, l , mid, x, mid), getmi(k + k + 1, mid + 1, r, mid + 1, y));
    }
    
    long long calcInterval(int k, int l, int r, int s, int e){
        if(l == s && r == e) return f[k];
        int mid = (l + r) >> 1;
        if(s > mid) return calcInterval(k + k + 1, mid + 1, r, s, e);
        else if(e <= mid) return calcInterval(k + k, l, mid, s, e);
        else return calcInterval(k + k, l, mid, s, mid) + calcInterval(k + k + 1, mid + 1, r, mid + 1, e);
    }

    void addSingle(int k, int l, int r, int x, int y){
        f[k] += y;
        if(l == r){
            mi[k] += y;
            return ;
        }
        int mid = (l + r) >> 1;
        if(x <= mid) addSingle(k + k, l, mid, x, y);
        else addSingle(k + k + 1, mid + 1, r, x, y);
        push_up(k);
    }
    
    
    BookMyShow(int zz, int zzz) {
        n = zz;
        m = zzz;
        buildTree(1, 1, n);
    }
    
    vector<int> gather(int k, int mxr) {
        if(k > m || getmi(1, 1, n, 1, mxr + 1) > m - k) return {};
        vector<int> ret;
        for(int i = 1; i <= mxr + 1; ++i){
            if(m - a[i] >= k){
                ret.push_back(i - 1);
                ret.push_back(a[i]);
                a[i] += k;
                addSingle(1, 1, n, i, k);
                break;
            }
        }
        return ret;
    }
    
    bool scatter(int k, int mxr) {
        vector<int> ret;
        if(calcInterval(1, 1, n, 1, mxr + 1) > (long long)(mxr + 1) * m - k) return false;
        for(int i = 1; i <= mxr + 1; ++i){
            if(a[i] == m) continue;
            if(m - a[i] < k){
                k -= m - a[i];
                addSingle(1, 1, n, i, m - a[i]);
                a[i] = m;
            }
            else{
                a[i] += k;
                addSingle(1, 1, n, i, k);
                break;
            }
        }
        return true;
    }
};

/**
 * Your BookMyShow object will be instantiated and called as such:
 * BookMyShow* obj = new BookMyShow(n, m);
 * vector<int> param_1 = obj->gather(k,maxRow);
 * bool param_2 = obj->scatter(k,maxRow);
 */
posted on 2022-06-02 13:39  damnglamour  阅读(33)  评论(0)    收藏  举报