AtCoder Beginner Contest 395 补题

AtCoder Beginner Contest 395 补题

D - Pigeon Swap

思路

用三个vector维护,记录

  1. \(i\) 个巢的标签鸽的编号
  2. 包含第 \(i\) 只标签鸽的巢的编号
  3. 包含第 \(i\) 只鸽子的巢的编号

题解里说的啥标签鸽实际上就是巢穴的相对位置,相当于贴标签。

操作2时,要更新标签鸽的位置,也得更新巢穴的相对位置。我之前总想着模拟把所有鸽子全填到另一个巢穴里,实际直接调换巢穴标签就可以了,实现 \(O(1)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, q;
const int N = 1e6+ 5;
vector<unsigned> b2l(N), l2b(N), p2b(N);
// b2l : box to label, 第i个巢的标签鸽的编号
// l2b : label to box,包含第i只标签鸽的巢的编号
// p2b : pigeon to box, 包含第i只鸽子的巢的编号
// 初始巢中的都是一只假定的标签鸽和一只普通鸽子

int main()
{
    std::ios::sync_with_stdio(false);
    cin >> n >> q;
    iota(begin(b2l), end(b2l), 0U);
    iota(begin(l2b), end(l2b), 0U);
    iota(begin(p2b), end(p2b), 0U);
    while (q--) {
        int op, a, b;
        cin >> op;
        if (op == 1) {
            cin >> a >> b;
            p2b[a - 1] = l2b[b - 1];
        }
        else if (op == 2) {
            cin >> a >> b;
            // 交换巢穴必须交换标签鸽,更新标签鸽的巢穴信息
            swap(l2b[a - 1], l2b[b - 1]);
            // 交换标签鸽后也要更新巢的信息
            swap(b2l[l2b[a - 1]], b2l[l2b[b - 1]]);
        }
        else {
            cin >> a;
            cout << b2l[p2b[a - 1]] + 1 << endl;
        }
    }
    cout.flush();
    return 0;
}

E - Flip Edge

或许会补


F - Smooth Occlusion

思路

直接上题解的代码了,之前想的和题解一样。

要确定上下两个牙齿的总最小高度,最后结果就是所有牙齿总高度 \(sum-\) 两牙齿总最小高度 \(\times N\)

这里有个要求,磨牙后上面相邻两个牙齿高度差不能大于 \(X\)

所以在每次输入的时候,要把上面和下面的牙齿扩大 \(X\),进行比较,如果新加入的数据大于扩大的数,说明新加入的牙齿肯定要被磨。

得到的 \(u\)\(d\) 是新一组最少磨牙的数据。

最后再把最小高度与 \(u+d\) 进行比较。

代码

#include <iostream>

int main() {
    using namespace std;
    unsigned N, X;
    cin >> N >> X;

    unsigned long sum{};
    unsigned height{2000000000}, u{1000000000}, d{1000000000};
    for (unsigned i{}, U, D; i < N; ++i) {
        cin >> U >> D;
        sum += U;
        sum += D;
        u = min(u + X, U);
        d = min(d + X, D);
        height = min(height, u + d);
    }

    cout << sum - static_cast<unsigned long>(height) * N << endl;
    return 0;
}

G - Minimum Steiner Tree 2

或许会补

posted @ 2025-03-03 22:59  AKgrid  阅读(20)  评论(0)    收藏  举报