比赛链接:Here

1541A. Pretty Permutations

给定 Codeforces Round #728 (Div. 2) - 图1 序列,让每一个数字都不处于原来的位置,但总的移动距离要最小


  • Codeforces Round #728 (Div. 2) - 图2 为偶数的情况 Codeforces Round #728 (Div. 2) - 图3
  • Codeforces Round #728 (Div. 2) - 图4 为奇数的情况 Codeforces Round #728 (Div. 2) - 图5

【AC Code】

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int a[110];
  4. for (int i = 1; i <= 101; ++i)a[i] = i;
  5. for (int i = 1; i <= 101; i += 2) swap(a[i], a[i + 1]);
  6. int _; for (cin >> _; _--;) {
  7. int n; cin >> n;
  8. if (n & 1) {
  9. for (int i = 1; i <= n - 2; ++i)
  10. cout << a[i] << " ";
  11. cout << n << " " << a[n - 1];
  12. } else {
  13. for (int i = 1; i <= n; ++i)
  14. cout << a[i] << " ";
  15. }
  16. cout << '\n';
  17. }
  18. }

1541B. Pleasant Pairs

问有多少对数 Codeforces Round #728 (Div. 2) - 图6#card=math&code=%28i%2Cj%29) 满足以下条件:

  • Codeforces Round #728 (Div. 2) - 图7
  • Codeforces Round #728 (Div. 2) - 图8

相同题型:ABC206 C - Swappable

枚举所有 Codeforces Round #728 (Div. 2) - 图9 的倍数加以判断

注意点:Codeforces Round #728 (Div. 2) - 图10

时间复杂度:Codeforces Round #728 (Div. 2) - 图11)#card=math&code=%5Cmathcal%7BO%7D%28n%C2%B7log%28n%29%29)

【AC Code】

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int _; for (cin >> _; _--;) {
  4. ll n; cin >> n;
  5. vector<ll>a(n + 1);
  6. for (int i = 1; i <= n; ++i)cin >> a[i];
  7. ll cnt = 0;
  8. for (int i = 1; i <= n; ++i)
  9. for (int j = a[i] - i; j <= n; j += a[i]) {
  10. if (j <= i) continue;
  11. else if (a[i] * a[j] == i + j)cnt++;
  12. }
  13. cout << cnt << "\n";
  14. }
  15. }

1541C. Great Graphs

Codeforces Round #728 (Div. 2) - 图12 个点和 Codeforces Round #728 (Div. 2) - 图13 数组,表示第 Codeforces Round #728 (Div. 2) - 图14 个点到第一个点的最短距离。

现在需要进行加边,然后使得所有边权和最小(可加负边)


思路转自码尔泰

很明显其实, Codeforces Round #728 (Div. 2) - 图15 其实可以排个序,对于最后结果并没有影响,之后我们可以考虑对于每个点,只建一条正向道路,使得满足题目条件,然后在满足题目条件的情况下尽可能多地建反向道路,这样可以减小总的边权和。

【AC Code】

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