【2022-06-25-第81场双周赛】

总结

Q2、Q4有点急了,不然不至于WA的。

Q1.统计星号

一开始看反了。用t标记一下状态,t = 0时当前不在一对竖线内,t = 1时当前在一对竖线内。

class Solution {
public:
    int countAsterisks(string s) {
        int ret = 0, t = 0;
        for(auto c : s){
            if(c == '|') if(t == 0) t = 1;else t = 0;
            if(c == '*' && t == 0) ++ret;
        }
        return ret;
    }
};

Q2.统计无向图中无法互相到达点对数

dfs找到每个连通块有多少个结点,然后前缀和统计。

class Solution {
public:
    long long countPairs(int n, vector<vector<int>>& e) {
        vector<int> adj[n];
        vector<long long> a;
        int vis[n]; memset(vis, 0, sizeof(vis));
        long long ret = 0;
        for(auto &v : e){
            adj[v[0]].push_back(v[1]);
            adj[v[1]].push_back(v[0]);
        }
        int t = 0;
        function<void(int)> dfs = [&](int idx){
            ++t;
            for(auto i : adj[idx]){
                if(!vis[i]){
                    vis[i] = 1;
                    dfs(i);
                }
            }
        };
        for(int i = 0 ; i < n; ++i){
            t = 0;
            if(!vis[i]){
                vis[i] = 1;
                dfs(i);
            }
            if(t) a.push_back(t);
        }
        if(a.size() == 1) return 0;
        long long ps[a.size() + 1]; ps[0] = 0;
        for(int i = 0; i < a.size(); ++i) ps[i + 1] = ps[i] + a[i];
        for(int i = 0 ; i < a.size(); ++i){
            ret += a[i] * ps[i];
        }
        return ret;
    }
};

Q3.操作后的最大异或和

脑筋急转弯,猜出来的答案。

class Solution {
public:
    int maximumXOR(vector<int>& a) {
        for(int i = 1; i < a.size(); ++i) a[i] |= a[i - 1];
        return a[a.size() - 1];
    }
};

Q4.不同骰子序列的数目

DP+前缀和。

class Solution {
public:
    const long long M = 1000000007;
    int distinctSequences(int n) {
        if(n == 1) return 6;
        if(n == 2) return 22;
        vector<vector<int>> a = {{}, {2, 3, 4, 5, 6}, {1, 3, 5}, {1, 2, 4, 5}, {1, 3, 5}, {1, 2, 3, 4, 6}, {1, 5}};
        long long dp[n][7], ps[2][n][7];
        memset(dp, 0, sizeof(dp));memset(ps, 0, sizeof(ps));
        for(int i = 1 ; i <= 6; ++i) ps[0][1][i] = dp[0][i] = 1, ps[1][1][i] = dp[1][i] = a[i].size();
        for(int i = 2; i < n; ++i){
            for(int j = 1; j <= 6; ++j){
                for(int k = 0; k < a[j].size(); ++k){
                    dp[i][j] += (ps[(i - 1) & 1][i - 1][a[j][k]] - ps[i & 1][i - 1][j] + M) % M;
                }
                dp[i][j] %= M;
                ps[0][i][j] = ps[0][i - 1][j], ps[1][i][j] = ps[1][i - 1][j];
                if(i & 1) ps[1][i][j] = (ps[1][i][j] + dp[i][j] + M) % M;
                else ps[0][i][j] = (dp[i][j] + ps[0][i][j] + M) % M;
            }
        }
        long long ret = 0;
        for(int i = 1; i <= 6; ++i) ret += dp[n - 1][i];
        return ret % M;
    }
};
posted on 2022-06-26 01:03  damnglamour  阅读(25)  评论(0)    收藏  举报