Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2) (ABCE补题记录)

补题链接:Here

1523A. Game of Life

生命游戏定义

本题中改编为一维坐标上的生命游戏


即使 \(m(m\in[1,1e9])\) 的范围很大,但每次进化不会超过 \(n\) 次,因为如果我们进化结果与上一代是相同的则说明游戏结束了,但我们只有 \(n\) 格。所以最多进行 \(n\) 次进化迭代

所以我们可以直接模拟进化过程

时间复杂度:\(\mathcal{O}(n^2)\)

void solve() {
    int n; ll m;
    string s;
    cin >> n >> m >> s;
    s = "0" + s + "0";
    while (m--) {
        string t = s;
        for (int i = 1; i <= n; ++i)
            t[i] |= s[i - 1] ^ s[i + 1];
        if (t == s)break;
        s = t;
    }
    cout << s.substr(1, n) << "\n";
}

1523B. Lord of the Values

现有两种操作:选定两个元素(\(i\not=j\ \in(1,n)\) ) ,\(n\le10^3\) 并且 \(n\) 为偶数

  1. \(a_i = a_i + a_j\)
  2. \(a_j=a_j-a_i\)

现在希望执行最多 \(5000\) 次操作使得 \([a_1,a_2,...,a_n] \to [-a_1,-a_2,...,-a_n]\)


这里读者可以手写模拟一下,要将任何一对数字 \((a,b)\) 转换为一对 \((-a,-b)\) ,可以执行一系列操作,例如 \((1,2,1,2,1,2)\),同时 \(n\) 为偶数,所以我们可以直接对 \((1,n)\) 的元素如上操作

时间复杂度:\(\mathcal{O}(n)\)

using ll = long long;
void solve() {
    int n; cin >> n;
    vector<ll>a(n + 1);
    for (int i = 1; i <= n; ++i)cin >> a[i];// 这里可以不用存,伪读入即可
    cout << n * 3 << '\n';
    for (int i = 1; i <= n; i += 2) {
        cout << "1 " << i << " " << i + 1 << '\n';
        cout << "2 " << i << " " << i + 1 << '\n';
        cout << "1 " << i << " " << i + 1 << '\n';
        cout << "2 " << i << " " << i + 1 << '\n';
        cout << "1 " << i << " " << i + 1 << '\n';
        cout << "2 " << i << " " << i + 1 << '\n';
    }
}

1523C. Compression and Expansion

有一个任务表,其中任务里也会嵌套任务,现在由于某些原因任务表出现问题,需要由我们恢复


这道题需要用 STL 构建堆栈。

在堆栈中维护列表的当前深度。 最初堆栈是空的。 对于每个新的 \(a_i\),有两个选项:

  • \(a_i = 1\): 我们只需将给定的数字添加到堆栈的末尾,它将指向列表中的一个新子项。
  • \(a_i>1\): 我们需要找到子项,它的最后一个数字将比 \(a_i\) 小 1。 为此,我们将从堆栈中删除最后一个元素,直到找到这个数字。

在每次迭代结束后,我们将打印结果堆栈作为列表中的新项目。 请注意,由于输出整个列表,复杂度将是二次的。

时间复杂度:\(\mathcal{O}(n^2)\)

void solve() {
    int n; cin >> n;
    vector<int>a;
    for (int i = 0, x; i < n; ++i) {
        cin >> x;
        if (x > 1) {
            while (!a.empty() && a.back() + 1 != x)
                a.pop_back();
            assert(!a.empty());
            a.pop_back();
        }
        a.push_back(x);
        for (int j = 0; j < (int) a.size(); j++) {
            if (j > 0) {
                cout << ".";
            }
            cout << a[j];
        }
        cout << '\n';
    }
}

1523E. Crypto Lights

【题意待补】


using ll = long long;
const int N = 1e5 + 10, P = 1e9 + 7;
ll n, k, ans, fac[N], inv[N];
ll qpow(ll a, ll b) {
    ll ans = 1;
    for (; b; b >>= 1, a = a * a % P)
        if (b & 1) ans = ans * a % P;
    return ans;
}
void initC() {
    fac[0] = 1;
    for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % P;
    inv[n] = qpow(fac[n], P - 2);
    for (int i = n; i >= 1; i--) inv[i - 1] = inv[i] * i % P;
}
ll C(ll n, ll m) {
    if (n < m) return 0;
    return fac[n] * inv[m] % P * inv[n - m] % P;
}
void solve() {
    cin >> n >> k;
    initC();
    ans = 1;
    for (int i = 1; (i - 1) * (k - 1) <= n; ++i)
        ans = (ans + C(n - (i - 1) * (k - 1), i) * qpow(C(n, i), P - 2) % P) % P;
    cout << ans << "\n";
}
posted @ 2021-06-01 10:20  Koshkaaa  阅读(100)  评论(0编辑  收藏  举报