ABCDEFjiangly的学习代码&& 菜鸡何时可以上紫(入门x)

在这里插入图片描述
大佬太强了,我何时可以上紫。。。。。。。。。。。

div2C

我以为是要模拟,但是jangly On(查看了)

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int t;
    std::cin >> t;
    while (t--) {
        int n;
        std::cin >> n;
        std::vector<int> p(n);
        for (int i = 0; i < n; ++i) {
            std::cin >> p[i];
            --p[i];
        }
        int l = -1, m = n;
        bool ok = true;
        for (int i = 0; i < n; ++i) {
            if (i < n - m && p[i] != p[l] + i - l) {
                ok = false;
                break;
            } else {
                l = i;
                m = p[i];
            }
        }
        if (ok) {
            std::cout << "Yes\n";
        } else {
            std::cout << "No\n";
        }
    }
    return 0;
}

div2D

放一个dfs写法,其实是DAG
他的dp有点长,还是看自己的吧。

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
std::string S[] = {"1110111", "0010010", "1011101", "1011011", "0111010", "1101011", "1101111", "1010010", "1111111", "1111011"};
int a[10];
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    for (int i = 0; i < 10; ++i)
        for (int j = 0; j < 7; ++j)
            a[i] = 2 * a[i] + S[i][j] - '0';
    int n, k;
    std::cin >> n >> k;
    std::vector<int> s(n);
    std::vector<std::vector<bool>> able(n, std::vector<bool>(8));
    std::vector<std::vector<bool>> suf(n + 1, std::vector<bool>(7 * n + 1));
    for (int i = 0; i < n; ++i) {
        int x = 0;
        for (int j = 0; j < 7; ++j) {
            char c;
            std::cin >> c;
            x = 2 * x + c - '0';
        }
        s[i] = x;
        for (int j = 0; j < 10; ++j) {
            if ((a[j] & x) == x) {
                int cnt = __builtin_popcount(a[j] ^ x);
                able[i][cnt] = true;
            }
        }
    }
    suf[n][0] = true;
    for (int i = n - 1; i >= 0; --i)
        for (int j = 0; j <= 7 * n; ++j)
            if (suf[i + 1][j])
                for (int k = 0; k <= 7; ++k)
                    if (able[i][k])
                        suf[i][j + k] = true;
    if (!suf[0][k]) {
        std::cout << -1 << "\n";
        return 0;
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 9; ; --j) {
            if ((a[j] & s[i]) == s[i]) {
                int cnt = __builtin_popcount(a[j] ^ s[i]);
                if (k >= cnt && suf[i + 1][k - cnt]) {
                    std::cout << j;
                    k -= cnt;
                    break;
                }
            }
        }
    }
    std::cout << "\n";
    return 0;
}

div2E

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
#include <deque>
#include <tuple>
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n, m;
    std::cin >> n >> m;
    std::vector<int> d(m);
    for (int i = 0; i < m; ++i)
        std::cin >> d[i];
    std::sort(d.begin(), d.end());
    int g, r;
    std::cin >> g >> r;
    std::vector<std::vector<int>> dp(m, std::vector<int>(g + 1, -1));
    std::deque<std::tuple<int, int, int>> que;
    que.emplace_back(0, 0, 0);
    while (!que.empty()) {
        auto [u, t, f] = que.front();
        que.pop_front();
        if (dp[u][t] != -1)
            continue;
        dp[u][t] = f;
        if (t == g)
            que.emplace_back(u, 0, f + 1);
        if (u != 0 && t + d[u] - d[u - 1] <= g)
            que.emplace_front(u - 1, t + d[u] - d[u - 1], f);
        if (u != m - 1 && t + d[u + 1] - d[u] <= g)
            que.emplace_front(u + 1, t + d[u + 1] - d[u], f);
    }
    long long ans = -1;
    for (int i = 0; i <= g; ++i)
        if (dp[m - 1][i] != -1 && (ans == -1 || ans > 1ll * (g + r) * dp[m - 1][i] + i))
            ans = 1ll * (g + r) * dp[m - 1][i] + i;
    std::cout << ans << "\n";
    return 0;
}

DIV2G

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
#include <deque>
#include <tuple>
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n;
    std::cin >> n;
    std::vector<std::vector<int>> e(n);
    for (int i = 0; i < n - 1; ++i) {
        int u, v;
        std::cin >> u >> v;
        --u;
        --v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    int ans = 0;
    for (int i = 0; i < n; ++i)
        ans = std::max(ans, int(e[i].size()));
    std::vector<std::pair<int, int>> steps;
    std::function<void(int, int, int)> dfs = [&](int u, int t, int p) {
        steps.emplace_back(u, t);
        int cur = t, rest = e[u].size() - (p != -1);
        for (auto v : e[u]) {
            if (v == p)
                continue;
            if (cur == ans) {
                cur = t - 1 - rest;
                steps.emplace_back(u, cur);
            }
            dfs(v, cur + 1, u);
            --rest;
            ++cur;
            steps.emplace_back(u, cur);
        }
        if (u == 0)
            return;
        if (cur != t - 1)
            steps.emplace_back(u, t - 1);
    };
    dfs(0, 0, -1);
    std::cout << steps.size() << "\n";
    for (auto [u, t] : steps)
        std::cout << u + 1 << " " << t << "\n";
    return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值