天梯赛L2题解(025-028)

L2-025 分而治之

记录度数就行,度数为0就孤立了

#include <bits/stdc++.h>
using namespace std;
#define int long long

void ylh_() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> g(n + 1);
    vector<int> d(n + 1);
    for (int i = 1; i <= m; ++i) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
        ++d[u];
        ++d[v];
    }
    int q;
    cin >> q;
    while (q--) {
        int t;
        cin >> t;
        vector<int> des(n + 1, 0);
        vector<int> deg = d;
        for (int i = 1; i <= t; ++i) {
            int u;
            cin >> u;
            des[u] = 1;
            for (auto v : g[u]) {
                --deg[v];
            }
        }
        int f = 1;
        for (int i = 1; i <= n; ++i) {
            if (!des[i]) {
                if (deg[i] > 0) {
                    f = 0;
                }
            }
        }
        if (f) {
            cout << "YES\n";
        } else {
            cout << "NO\n";
        }
    }
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) {
        ylh_();
    }
}

L2-026 小字辈

是不是bfs好一点,我这里用的dfs,无所谓了

#include <bits/stdc++.h>
using namespace std;
#define int long long

void ylh_() {
    int n;
    cin >> n;
    vector<vector<int>> g(n + 1);
    int rt = 0;
    for (int i = 1; i <= n; ++i) {
        int f;
        cin >> f;
        if (f == -1) {
            rt = i;
            continue;
        }
        g[f].push_back(i);
    }
    int mxdep = 1;
    vector<int> ans;
    auto dfs = [&](auto&& dfs, int u, int dep) -> void {
        if (dep == mxdep) {
            ans.push_back(u);
        }
        if (dep > mxdep) {
            ans.clear();
            mxdep = dep;
            ans.push_back(u);
        }
        for (auto v : g[u]) {
            dfs(dfs, v, dep + 1);
        }
    };
    dfs(dfs, rt, 1);
    sort(ans.begin(), ans.end());
    cout << mxdep << '\n';
    for (int i = 0; i < ans.size(); ++i) {
        cout << ans[i];
        if (i != ans.size() - 1) {
            cout << ' ';
        }
    }
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) {
        ylh_();
    }
}

L2-027 名人堂与代金券

排个序输出就行了

#include <bits/stdc++.h>
using namespace std;
#define int long long

void ylh_() {
    int n, g, k;
    cin >> n >> g >> k;
    vector<pair<string, int>> a(n + 1);
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i].first >> a[i].second;
        if (a[i].second >= g) {
            ans += 50;
        } else if (a[i].second >= 60) {
            ans += 20;
        }
    }
    cout << ans << '\n';
    sort(a.begin() + 1, a.end(), [&](pair<string, int> x, pair<string, int> y) {
        if (x.second == y.second)
            return x.first < y.first;
        return x.second > y.second;
    });
    int rank = 1;
    a[0] = { "fkxqsvivo50", a[1].second };
    for (int i = 1; i <= n; ++i) {
        if (a[i].second != a[i - 1].second) {
            rank = i;
        }
        if (rank > k)
            break;
        cout << rank << ' ' << a[i].first << ' ' << a[i].second << '\n';
    }
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) {
        ylh_();
    }
}

L2-028 秀恩爱分得快

写完发现有点啰嗦,但是能过就行,要注意-0这个点,编号为0的可能是女孩子

#include <bits/stdc++.h>
using namespace std;
#define int long long

const double EPS = 1e-5;

void ylh_() {
    int n, k;
    cin >> n >> k;
    vector<int> sex(n + 1);
    vector<vector<int>> p(k + 1);
    for (int i = 1; i <= k; ++i) {
        int m;
        cin >> m;
        p[i].resize(m + 1);
        p[i][0] = m;
        for (int j = 1; j <= m; ++j) {
            string s;
            cin >> s;
            int num = 0;
            if (s[0] == '-') {
                for (int l = 1; l < s.length(); ++l) {
                    num *= 10;
                    num += s[l] - '0';
                }
                sex[num] = 0;
            } else {
                for (int l = 0; l < s.length(); ++l) {
                    num *= 10;
                    num += s[l] - '0';
                }
                sex[num] = 1;
            }
            p[i][j] = num;
        }
    }
    int x, y;
    cin >> x >> y;
    x = abs(x), y = abs(y);
    vector<double> px(n);
    vector<double> py(n);
    double max_x = 0, max_y = 0;
    for (int i = 1; i <= k; ++i) {
        int pos = -1;
        for (int j = 1; j <= p[i][0]; ++j) {
            if (p[i][j] == x) {
                pos = j;
            }
        }
        if (pos == -1) {
            continue;
        }
        for (int j = 1; j <= p[i][0]; ++j) {
            int v = p[i][j];
            if (sex[v] == sex[x])
                continue;
            px[v] += 1.0 / p[i][0];
            max_x = max(px[v], max_x);
        }
    }

    for (int i = 1; i <= k; ++i) {
        int pos = -1;
        for (int j = 1; j <= p[i][0]; ++j) {
            if (p[i][j] == y) {
                pos = j;
            }
        }
        if (pos == -1) {
            continue;
        }
        for (int j = 1; j <= p[i][0]; ++j) {
            int v = p[i][j];
            if (sex[v] == sex[y])
                continue;
            py[v] += 1.0 / p[i][0];
            max_y = max(py[v], max_y);
        }
    }

    auto equal = [](double x, double y) -> bool {
        return (abs(x - y) <= EPS);
    };
    auto print = [&](int x) -> void {
        if (sex[x] == 0) {
            cout << '-' << x;
        } else {
            cout << x;
        }
    };
    if (equal(max_x, px[y]) && equal(max_y, py[x])) {
        print(x);
        cout << ' ';
        print(y);
        return;
    }

    vector<int> ansx, ansy;
    for (int i = 0; i < n; ++i) {
        if (sex[x] != sex[i] && equal(max_x, px[i])) {
            ansx.push_back(i);
        }
    }
    for (int i = 0; i < n; ++i) {
        if (sex[y] != sex[i] && equal(max_y, py[i])) {
            ansy.push_back(i);
        }
    }
    for (int i = 0; i < ansx.size(); ++i) {
        print(x);
        cout << ' ';
        print(ansx[i]);
        cout << '\n';
    }

    for (int i = 0; i < ansy.size(); ++i) {
        print(y);
        cout << ' ';
        print(ansy[i]);
        cout << '\n';
    }
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) {
        ylh_();
    }
}
posted @ 2026-03-25 13:06  特瑞斯特  阅读(3)  评论(0)    收藏  举报