1. 程式人生 > 其它 >Codeforces Round #728 (Div. 2) A~C 補題記錄

Codeforces Round #728 (Div. 2) A~C 補題記錄

比賽連結:Here

1541A. Pretty Permutations

給定 \(1,2,3,4,...n\) 序列,讓每一個數字都不處於原來的位置,但總的移動距離要最小


  • \(n\) 為偶數的情況 \(1,2,3,4 \to 2,1,4,3\)
  • \(n\) 為奇數的情況 \(1,2,3,4,5 \to 2,1,4,5,3\)

【AC Code】

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int a[110];
    for (int i = 1; i <= 101; ++i)a[i] = i;
    for (int i = 1; i <= 101; i += 2) swap(a[i], a[i + 1]);
    int _; for (cin >> _; _--;) {
        int n; cin >> n;
        if (n & 1) {
            for (int i = 1; i <= n - 2; ++i)
                cout << a[i] << " ";
            cout << n << " " << a[n - 1];
        } else {
            for (int i = 1; i <= n; ++i)
                cout << a[i] << " ";
        }
        cout << '\n';
    }
}

1541B. Pleasant Pairs

問有多少對數 \((i,j)\) 滿足以下條件:

  • \(i < j\)
  • \(a_i * a_j = i + j\)

相同題型:ABC206 C - Swappable

列舉所有 \(a_i\) 的倍數加以判斷

注意點:\(i \not = j\)

時間複雜度:\(\mathcal{O}(n·log(n))\)

【AC Code】

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        ll n; cin >> n;
        vector<ll>a(n + 1);
        for (int i = 1; i <= n; ++i)cin >> a[i];
        ll cnt = 0;
        for (int i = 1; i <= n; ++i)
            for (int j = a[i] - i; j <= n; j += a[i]) {
                if (j <= i) continue;
                else if (a[i] * a[j] == i + j)cnt++;
            }
        cout << cnt << "\n";
    }
}

1541C. Great Graphs

\(n\) 個點和 \(d\) 陣列,表示第 \(i\) 個點到第一個點的最短距離。

現在需要進行加邊,然後使得所有邊權和最小(可加負邊)


思路轉自碼爾泰

很明顯其實, \(d[i]\) 其實可以排個序,對於最後結果並沒有影響,之後我們可以考慮對於每個點,只建一條正向道路,使得滿足題目條件,然後在滿足題目條件的情況下儘可能多地建反向道路,這樣可以減小總的邊權和。

【AC Code】

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        int n; cin >> n;
        vector<ll>d(n + 1), sum(n + 1);
        for (int i = 1; i <= n; ++i)cin >> d[i];
        ll b = 1e9 + 7;
        sort(d.begin() + 1, d.end());
        for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + d[i];
        ll ans = 0;
        for (int i = 3; i <= n; ++i)
            ans -= d[i] * (i - 2) - sum[i - 2];
        cout << ans << "\n";
    }
}

The desire of his soul is the prophecy of his fate
你靈魂的慾望,是你命運的先知。