Codeforces Round 918(Div. 4)

 A

算法:

        模拟。

code:

void solve()
{
    int a, b, c;
    cin >> a >> b >> c;

    cout << (a ^ b ^ c) << endl;
}

B

算法:

        模拟。

code:

void solve()
{
    string s[3];
    cin >> s[0] >> s[1] >> s[2];

    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            if (s[i][j] == '?')
            {
                bool A = 0, B = 0, C = 0;
                for (int k = 0; k < 3; ++k)
                {
                    if (s[i][k] == 'A')
                        A = 1;
                    else if (s[i][k] == 'B')
                        B = 1;
                    else if (s[i][k] == 'C')
                        C = 1;
                }

                if (!A)
                    cout << 'A' << endl;
                else if (!B)
                    cout << 'B' << endl;
                else
                    cout << 'C' << endl;
                return;
            }
        }
    }
}

C

算法:

        模拟。

code:

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

    ll sum = 0;
    for (int i = 0; i < n; ++i)
    {
        ll x;
        cin >> x;
        sum += x;
    }

    if ((ll)sqrtl(sum) * (ll)sqrtl(sum) == sum)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

D

算法:

        模拟,双指针。

code:

void solve()
{
    int n;
    string s;
    cin >> n >> s;

    map<char, int> m;
    m['a'] = m['e'] = 1;

    string ans;
    for (int i = 0; i < n; ++i)
    {
        if (m[s[i]])
            ans += 'V';
        else
            ans += 'C';
    }

    vi st(n + 10, 0);
    for (int i = s.size() - 1; ~i; --i)
    {
        int j = i - 1;
        while (~j && ans[j] != 'C')
            --j;
        st[j] = 1;
        i = j;
    }

    for (int i = 0; i < n; ++i)
    {
        cout << s[i];
        if (st[i + 1])
            cout << '.';
    }
    cout << endl;
}

E

算法:

        思维,前缀和。

思路:

        原问题中需要求出一个区间使\(a_l + a_{l + 2} + \text{…} + a_r = a_{l+1} + a_{l + 3} + \text{…} + a_{r- 1 }\),既选择一个区间使得奇数下标元素和与偶数下标元素和相等。

        不难发现可以将问题装换为\(a_l – a_{l+1} + a_{l + 2} – a_{l + 3} + \text{…} – a_{r- 1 } + a_r = 0\),此时问题为选择一个区间和为0的区间,不难想到如果两个有交集且不完全相同的区间和相等,那么他们未相交的地方的和必然为0,所以只需判断有有没有两个区间和相等。

        时间复杂度为 O(n)。

code:

void solve()
{
    int n;
    cin >> n;
    vi a(n + 10);
    for (int i = 1; i <= n; ++i)
        cin >> a[i];

    for (int i = 1; i <= n; ++i)
        if (i % 2 == 0)
            a[i] = -a[i];

    map<ll, ll> m;
    m[0] = 1;
    ll sum = 0;
    for (int i = 1; i <= n; ++i)
    {
        sum += a[i];
        if (m[sum])
        {
            cout << "YES" << endl;
            return;
        }
        ++m[sum];
    }

    cout << "NO" << endl;
}

F

算法:

        思维,逆序对。

思路:

        不难发现只有一个区间完全包含另一个区间时两个人才会相遇,所以只需对左端点进行排序,再对右端点找逆序对即可。

code:

int tmp[N];
ll merge_sort(int q[], int l, int r)
{
    if (l >= r)
        return 0;

    int mid = l + r >> 1;

    ll ans = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);

    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
    {
        if (q[i] <= q[j])
            tmp[k++] = q[i++];
        else
        {
            ans += mid - i + 1;
            tmp[k++] = q[j++];
        }
    }

    while (i <= mid)
        tmp[k++] = q[i++];
    while (j <= r)
        tmp[k++] = q[j++];

    for (int i = l, j = 0; i <= r; i++, j++)
        q[i] = tmp[j];

    return ans;
}

void solve()
{
    int n;
    cin >> n;
    vector<pii> a(n + 10);
    for (int i = 0; i < n; ++i)
        cin >> a[i].first >> a[i].second;

    sort(a.begin(), a.begin() + n);

    int v[N];
    for (int i = 0; i < n; ++i)
        v[i] = a[i].second;

    cout << merge_sort(v, 0, n - 1) << endl;
}

暂无评论

发送评论 编辑评论


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