Codeforces Round #728 (Div. 2) A~C 補題記錄
阿新 • • 發佈:2021-07-07
比賽連結: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
你靈魂的慾望,是你命運的先知。