AtCoder Beginner Contest 398

链接:https://atcoder.jp/contests/abc398

A – Doors in the Center

算法:

    模拟。

思路:

    无。

关键代码:

void miyan()
{
    int n;
    cin >> n;

    if (n & 1)
    {
        cout << string(n / 2, '-');
        cout << '=';
        cout << string(n / 2, '-') << endl;
    }
    else
    {
        cout << string((n - 1) / 2, '-');
        cout << '=';
        cout << '=';
        cout << string((n - 1) / 2, '-') << endl;
    }
}

B – Full House 3

算法:

    模拟。

思路:

    无。

关键代码:

void miyan()
{
    map<int, int> m;
    for (int i = 0; i < 7; ++i)
    {
        int x;
        cin >> x;
        ++m[x];
    }

    int cnt1 = 0, cnt2 = 0;
    for (auto [_, x] : m)
    {
        if (x >= 3)
            ++cnt1;
        else if (x >= 2)
            ++cnt2;
    }

    if (cnt1 >= 2 || (cnt1 && cnt2))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}

C – Uniqueness

算法:

    模拟。

思路:

    无。

关键代码:

void miyan()
{
    int n;
    cin >> n;
    map<int, vector<int>, greater<>> m;
    for (int i = 0; i < n; ++i)
    {
        int x;
        cin >> x;
        m[x].push_back(i);
    }

    ll ans = -2;
    for (auto [x, v] : m)
    {
        if (v.size() == 1 && ans == -2)
            ans = v.back();
    }

    cout << ans + 1 << endl;
}

D – Bonfire

算法:

    思维,前缀和。

思路:

    对于 \(i\),只要存在一个 \(j\) 使得 \(s[i \text{ ~ } j]\) 移动到 \((R, C)\) 点,那么这一时刻 \(s[i] =\) '1'

    将 \(N、W、S、E\) 转换成二元组前缀和,此时就将问题转换为了寻找一段区间其和为 \((R, C)\)。

    哈希表 + 前缀和解决即可。

关键代码:

void miyan()
{
    int n, x, y;
    string s;
    cin >> n >> x >> y >> s;

    s = ' ' + s;

    vector<pii> pre(n, {0, 0});
    for (int i = 1; i <= n; ++i)
    {
        pre[i] = pre[i - 1];
        if (s[i] == 'N')
            --pre[i].first;
        else if (s[i] == 'W')
            --pre[i].second;
        else if (s[i] == 'S')
            ++pre[i].first;
        else
            ++pre[i].second;
    }

    string ans;
    map<pii, int> m;
    for (int i = 1; i <= n; ++i)
    {
        ++m[pre[i - 1]];

        int l = pre[i].first - x;
        int r = pre[i].second - y;

        if (m.count({l, r}))
            ans.push_back('1');
        else
            ans.push_back('0');
    }

    cout << ans << endl;
}

E – Tree Game

算法:

    交互,二分图。

思路:

    不存在奇数环等价于是一个二分图。

    最后操作完后,图一定变为一个完全二分图,一个图其完全二分图最大边数 \(= cnt0 * cnt1\),其中 \(cnt0\) 与 \(cnt1\) 为在二分图上两种不同的染色。

    那么对于一个图其可操作次数为 \(cnt0 * cnt1 – (n – 1)\),如果可操作奇数条边就选择先手,否者后手,每次输出一个不同染色并且不存在的边。

关键代码:

void miyan()
{
    int n;
    cin >> n;
    vector<vector<int>> g(n + 1);
    vector st(n + 1, vector<int>(n + 1, 0));
    for (int i = 0; i < n - 1; ++i)
    {
        int u, v;
        cin >> u >> v;
        st[u][v] = 1;
        st[v][u] = 1;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    vector<int> col(n + 1, 0);
    auto dfs = [&](auto &&self, int u, int f) -> void
    {
        for (auto v : g[u])
        {
            if (v == f)
                continue;

            col[v] = col[u] ^ 1;

            self(self, v, u);
        }
    };

    col[1] = 1;
    dfs(dfs, 1, 0);

    int cnt1 = accumulate(all(col), 0ll);
    int cnt0 = n - cnt1;

    int tot = cnt1 * cnt0 - n + 1;

    int u, v;
    if (tot & 1)
        cout << "First" << endl;
    else
    {
        cout << "Second" << endl;
        cin >> u >> v;
        st[u][v] = 1;
    }

    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (i == j)
                continue;

            if (!st[i][j] && !st[j][i] && col[i] != col[j])
            {
                cout << i << ' ' << j << endl;
                st[i][j] = st[j][i] = 1;
                cin >> u >> v;
                st[u][v] = st[v][u] = 1;
            }
        }
    }
}

F – ABCBA

算法:

    \(manacher\)。

思路:

    板子。

关键代码:

vector<int> manacher(string ss)
{
    int m = ss.size();
    vector<int> p(m, 0);
    int c = 0, r = 0;
    for (int i = 0; i < m; ++i)
    {
        int len = r > i ? min(p[2 * c - i], r - i) : 1;

        while (i + len < m && i - len >= 0 && ss[i + len] == ss[i - len])
            ++len;

        if (i + len > r)
        {
            r = i + len;
            c = i;
        }

        p[i] = len;
    }

    return p;
}

void miyan()
{
    string s;
    cin >> s;

    int n = s.size();
    string ss;
    ss.push_back('#');
    for (int i = 0; i < n; ++i)
    {
        ss.push_back(s[i]);
        ss.push_back('#');
    }

    auto p = manacher(ss);

    int m = p.size();
    ll maxx = 1;
    for (int i = 0; i < m; ++i)
    {
        if (i + p[i] == m)
            maxx = max(maxx, p[i] - 1ll);
    }

    cout << s;
    for (int i = n - maxx - 1; i >= 0; --i)
        cout << s[i];
    cout << endl;
}

G – Not Only Tree Game

    还没补。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇