• Codeforces Round #670 (Div. 2)


    题目传送门

    A. Subset Mex

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define rep(i, a, b) for (register int i = a; i <= b; i++)
     
    int n;
    int a[110], cnt[110];
    inline void solve(int T) {
     
        cin >> n;
        int ans = 0;
        rep(i, 0, 105) cnt[i] = 0;
        rep(i, 1, n) cin >> a[i], cnt[a[i]]++;
        rep(i, 0, 105) if(cnt[i]) {
            cnt[i]--;
        } else {
            ans += i;
            break;
        }
        rep(i, 0, 105) if(cnt[i]) {
            cnt[i]--;
        } else {
            ans += i;
            break;
        }
        cout << ans << endl;
        
     
        
    }
    int main()
    {
        // ios_base::sync_with_stdio(0);
        // cin.tie(0);
        // cout.tie(0);
     
        // freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
     
        int T = 1;
        cin >> T;
        rep(i, 1, T) solve(i);
        
        // system("pause");
    }
    View Code

    B. Maximum Product

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define rep(i, a, b) for (register int i = a; i <= b; i++)
     
    ll n;
    ll a[100010];
     
    inline void solve(int T) {
     
        cin >> n;
        rep(i, 1, n) cin >> a[i];
        sort(a + 1, a + n + 1);
        ll ans = a[1] * a[2] * a[3] * a[4] * a[5];
        ans = max(ans, a[1] * a[2] * a[3] * a[4] * a[n]);
        ans = max(ans, a[1] * a[2] * a[3] * a[n - 1] * a[n]);
        ans = max(ans, a[1] * a[2] * a[n - 2] * a[n - 1] * a[n]);
        ans = max(ans, a[1] * a[n - 3] * a[n - 2] * a[n - 1] * a[n]);
        ans = max(ans, a[n - 4] * a[n - 3] * a[n - 2] * a[n - 1] * a[n]);
        cout << ans<< endl;
     
        
    }
    int main()
    {
        // ios_base::sync_with_stdio(0);
        // cin.tie(0);
        // cout.tie(0);
     
        // freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
     
        int T = 1;
        cin >> T;
        rep(i, 1, T) solve(i);
        
        // system("pause");
    }
    View Code

    C. Link Cut Centroids

    主要是找重心,如果有两个就把其中一个作为根,找到最大的连通块取一个点连向根

    解释的不是很清楚,具体看代码

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define rep(i, a, b) for (register int i = a; i <= b; i++)
     
    int n;
    vector<int> son[100010];
    int sz[100010], max_part[100010];
    int vis[100010];
    int ma, cnt, point;
     
    void dfs(int u, int fa) {
        sz[u] = 1;
        max_part[u] = 0;
        for(vector<int>::iterator it = son[u].begin(); it != son[u].end(); it++) {
            int v = *it;
            if(v == fa) continue;
            dfs(v, u);
            sz[u] += sz[v];
            max_part[u] = max(max_part[u], sz[v]);
        }
        max_part[u] = max(max_part[u], n - sz[u]);
        if(max_part[u] < ma) {
            cnt = 1;
            ma = max_part[u];
            point = u;
        }
        else if(max_part[u] == ma) cnt++;
    }
    bool cmp(int ff, int gg) {return sz[ff] > sz[gg];}
     
    inline void solve(int T) {
     
        cin >> n;
        rep(i, 1, n) son[i].clear();
        ma = n * 2;
        cnt = point = 0;
        int x, y;
        rep(i, 1, n - 1) {
            cin >> x >> y;
            son[x].push_back(y);
            son[y].push_back(x);
        }
        dfs(1, 0);
        // cout << max_part[point] << " " << point << " " << cnt << endl;
        if(cnt == 1) cout << x << " " << y << endl << x << " " << y << endl;
        else {
            dfs(point, 0);
            int u = point, v;
            while(son[u].size() > 1) {
                sort(son[u].begin(), son[u].end(), cmp);
                v = u;
                if(u == point) u = son[u][0];
                else u = son[u][1];
            }
            cout << u << " " << v << endl << u << " " << point << endl;
        }
        
    }
    int main()
    {
        // ios_base::sync_with_stdio(0);
        // cin.tie(0);
        // cout.tie(0);
     
        // freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
     
        int T = 1;
        cin >> T;
        rep(i, 1, T) solve(i);
        
        // system("pause");
    }
    View Code
  • 相关阅读:
    第十周阅读内容
    第十周学习小结
    第九周阅读内容
    第九周学习小结
    第八周学习小结
    ..总结
    .总结
    总结.
    周总结
    总结
  • 原文地址:https://www.cnblogs.com/likunhong/p/13659984.html
Copyright © 2020-2023  润新知