牛客周赛 Round 34

A

void solve()
{
    string a, b;
    cin >> a >> b;
    set<string> s;
    s.insert(a);
    s.insert(b);
    s.insert(a + b);
    s.insert(b + a);
    cout << s.size() << endl;
    for (auto i : s)
        cout << i << endl;
}

B

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    set<int> s;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (a[i] <= n && a[i] >= 1)
            s.insert(a[i]);
    }
    if (s.size() != n)
        cout << "0" << endl;
    else
    {
        cout<<1<<endl;
        cout<<"1 100000000"<<endl;
    }
}

C

注意sort的比较函数要满足严格偏序

bool cmp(string a, string b)
{
    if (a.size() != b.size())
        return a.size() < b.size();
    for (int i = 0; i < a.size(); i++)
    {
        if (a[i] != b[i])
            return (a[i] - '0') < (b[i] - '0');
    }
    return false;
}
void solve()
{
    string s, res = "";
    res.clear();
    vector<string> ans;
    cin >> s;
    for (auto i : s)
    {
        res += i;
        if (res.back() == '0' || res.back() == '2' || res.back() == '4' || res.back() == '6' || res.back() == '8')
            ans.push_back(res), res.clear();
    }
    sort(ans.begin(), ans.end(), cmp);
    for (auto i : ans)
        cout << i << endl;
}

D

分类讨论

特判全是0的情况

void solve()
{
    int n;
    cin >> n;
    vector<ll> a(n + 1, 0);
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    auto cal = [&]() -> ll
    {
        ll s = 0;
        for (int i = 2; i <= n; i++)
            s += abs(a[i] - a[i - 1]);
        return s;
    };
    if (a[1])
    {
        for (int i = 2; i < n; i++)
            if (!a[i])
                a[i] = a[i - 1];
        if (!a[n])
        {
            if (a[n - 1] != a[1])
                a[n] = a[n - 1];
            else
                a[n] = a[n - 1] + 1;
        }
    }
    else if (a[n])
    {
        for (int i = n - 1; i >= 2; i--)
            if (!a[i])
                a[i] = a[i + 1];
        if (!a[1])
        {
            if (a[2] != a[n])
                a[1] = a[2];
            else
                a[1] = a[2] + 1;
        }
    }
    else
    {
        for (int i = 2; i <= n; i++)
            if (!a[i])
                a[i] = a[i - 1];
        for (int i = 1; i <= n; i++)
            if (a[i])
            {
                if (a[i] == a[n])
                {
                    for (int j = 1; j < i; j++)
                        a[j] = a[i] + 1;
                }
                else
                {
                    for (int j = 1; j < i; j++)
                        a[j] = a[i];
                }
                break;
            }
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++)
        if (!a[i])
            cnt++;
    if (cnt == n)
    {
        a[1] = 1;
        for (int i = 2; i <= n; i++)
            a[i] = 2;
    }
    if (cal() == 1)
    {
        for (int i = 1; i <= n; i++)
            cout << a[i] << " ";
        cout << endl;
    }
    else
        cout << "-1" << endl;
}

E

void solve()
{
    int n;
    cin >> n;
    vector<vector<int>> e(n + 1);
    vector<char> c(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> c[i];
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v), e[v].push_back(u);
    }
    vector<vector<int>> f(n + 1, vector<int>(2, 0));
    auto dfs = [&](auto dfs, int u, int fa) -> void
    {
        if (c[u] == '?')
            f[u][1] = f[u][0] = 1;
        if (c[u] == 'd')
            f[u][1] = 1;
        if (c[u] == 'p')
            f[u][0] = 1;
        for (auto to : e[u])
            if (to != fa)
            {
                dfs(dfs, to, u);
                if (f[to][0] && !f[to][1])
                    f[u][0] = 0;
                if (!f[to][0] && f[to][1])
                    f[u][1] = 0;
                if (!f[to][0] && !f[to][1])
                    f[u][1] = f[u][0] = 0;
            }
    };
    dfs(dfs, 1, 0);
    auto draw = [&](auto draw, int u, int fa, int t) -> void
    {
        if (c[u] == '?')
            c[u] = (t ? 'd' : 'p');
        for (auto to : e[u])
            if (to != fa)
                draw(draw, to, u, 1 - t);
    };
    if (f[1][0] || f[1][1])
    {
        if (f[1][0])
            draw(draw, 1, 0, 0);
        else if (f[1][1])
            draw(draw, 1, 0, 1);
        for (int i = 1; i <= n; i++)
            cout << c[i];
        cout << endl;
    }
    else
        cout << "-1" << endl;
}

F

首先注意到可以构造一个2*2的矩形,把x平均放入,这样就解决了x%4==0

剩下的x%4==2

011

101

110

void solve()
{
    int n, m, x;
    cin >> n >> m >> x;
    vector<vector<int>> ans(n + 1, vector<int>(m + 1, 0));
    if (x == 2)
    {
        cout << "-1" << endl;
        return;
    }
    if (x % 4 == 0)
    {
        for (int i = 1; i <= 2; i++)
            for (int j = 1; j <= 2; j++)
                ans[i][j] = x / 4;
    }
    else
    {
        x -= 6;
        for (int i = 1; i <= 2; i++)
            for (int j = 1; j <= 2; j++)
                ans[i][j] = x / 4;
        ans[2][3]++, ans[2][4]++, ans[3][4]++;
        ans[3][2]++, ans[4][2]++, ans[4][3]++;
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            cout << ans[i][j] << " ";
        cout << endl;
    }
}

G

如果没有颜色限制,就是置换环板子

但是有了颜色限制后,纯色环就无法操作了,需要先把纯色环变成混色环

按照优先级考虑:

1.红环+白环

2.红环+混环/白环+混环

特殊的,如果环的大小为1,是不需要成为混环的,但是可以帮助别的纯色环变成混环,按照贪心尽量往后放

void solve()
{
    int n, ans = 0;
    cin >> n;
    vector<int> a(n + 1), vis(n + 1, 0);
    vector<char> c(n + 1);
    vector<pii> r, w, h;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        cin >> c[i];
    for (int i = 1; i <= n; i++)
    {
        if (vis[i])
            continue;
        int cntr = 0, cntw = 0, u = i, sz = 0;
        while (!vis[u])
        {
            vis[u] = 1, sz++;
            if (c[u] == 'W')
                cntw = u;
            else
                cntr = u;
            u = a[u];
        }
        if (cntr && !cntw)
            r.push_back({sz, cntr});
        else if (!cntr && cntw)
            w.push_back({sz, cntw});
        else
            h.push_back({cntr, cntw});
    }
    sort(r.begin(), r.end()), sort(w.begin(), w.end());
    while (w.size() && r.size())
    {
        auto [nw, pw] = w.back();
        auto [nr, pr] = r.back();
        w.pop_back(), r.pop_back();
        if (nw == 1 && nr == 1)
            continue;
        swap(a[pw], a[pr]);
        h.push_back({pw, pr});
        ans++;
    }
    while (w.size() && h.size())
    {
        auto [nw, pw] = w.back();
        auto [posr, posw] = h.back();
        w.pop_back();
        if (nw == 1)
            continue;
        swap(a[pw], a[posr]);
        h.push_back({posr, pw});
        ans++;
    }
    while (r.size() && h.size())
    {
        auto [nr, pr] = r.back();
        auto [posr, posw] = h.back();
        r.pop_back();
        if (nr == 1)
            continue;
        swap(a[pr], a[posw]);
        h.push_back({pr, posw});
        ans++;
    }
    int szr = r.size(), szw = w.size();
    for (auto i : r)
        szr -= (i.x == 1);
    for (auto i : w)
        szw -= (i.x == 1);
    if (szr || szw)
    {
        cout << "-1" << endl;
        return;
    }
    for (int i = 1; i <= n; i++)
        vis[i] = 0;
    for (int i = 1; i <= n; i++)
        if (!vis[i])
        {
            int u = i, sz = 0;
            while (!vis[u])
                vis[u] = 1, sz++, u = a[u];
            ans += sz - 1;
        }
    cout << ans << endl;
}
posted @ 2024-02-29 16:28  0x3ea  阅读(4)  评论(0编辑  收藏  举报