比赛链接:Here

1301A. Three Strings

题意:

给三个相同长的字符串 Codeforces Round #619 (Div. 2)A-D - 图1 ,对于每个位置 Codeforces Round #619 (Div. 2)A-D - 图2 ,你必须做一次操作:交换 Codeforces Round #619 (Div. 2)A-D - 图3Codeforces Round #619 (Div. 2)A-D - 图4 ,或者交换 Codeforces Round #619 (Div. 2)A-D - 图5Codeforces Round #619 (Div. 2)A-D - 图6。问你交换完之后 Codeforces Round #619 (Div. 2)A-D - 图7Codeforces Round #619 (Div. 2)A-D - 图8 能否一样。

因为每个位置必须交换,所以每个位置只要 Codeforces Round #619 (Div. 2)A-D - 图9 或者 Codeforces Round #619 (Div. 2)A-D - 图10 即可

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int _; for (cin >> _; _--;) {
  4. string a, b, c;
  5. cin >> a >> b >> c;
  6. bool f = 1;
  7. for (int i = 0; f and i < a.size(); ++i) {
  8. if (a[i] == c[i] || b[i] == c[i]) continue;
  9. f = 0;
  10. }
  11. cout << (f ? "YES\n" : "NO\n");
  12. }
  13. }

1301B. Motarack’s Birthday

题意:

给一个长为 Codeforces Round #619 (Div. 2)A-D - 图11 的整数数组,其中有一些数消失了,用 Codeforces Round #619 (Div. 2)A-D - 图12 代替,其他数大于等于 Codeforces Round #619 (Div. 2)A-D - 图13,然后叫你找一个非负数 Codeforces Round #619 (Div. 2)A-D - 图14 ,使得用 Codeforces Round #619 (Div. 2)A-D - 图15 替代所有 Codeforces Round #619 (Div. 2)A-D - 图16 后,相邻元素的差值的最大值,这个值要最小。

思路:

差值最大值无非就是,原来就有的数之间的相邻差值最大值,和替换后k与原来就有的数的差值的最大值里求一个 Codeforces Round #619 (Div. 2)A-D - 图17 。前者可以直接求的,后者当 Codeforces Round #619 (Div. 2)A-D - 图18 取到 Codeforces Round #619 (Div. 2)A-D - 图19%2F2#card=math&code=%28m_i%2Bmx%29%2F2) 时取到最小。Codeforces Round #619 (Div. 2)A-D - 图20 为与 Codeforces Round #619 (Div. 2)A-D - 图21 邻的原来有的数的最小值,Codeforces Round #619 (Div. 2)A-D - 图22 为最大值。

  1. const int N = 1e5 + 10;
  2. ll a[N];
  3. int main() {
  4. cin.tie(nullptr)->sync_with_stdio(false);
  5. int _; for (cin >> _; _--;) {
  6. int n; cin >> n;
  7. for (int i = 0; i < n; ++i) cin >> a[i];
  8. ll base = 0;
  9. vector<ll>v;
  10. for (int i = 0; i < n - 1; ++i) {
  11. if (a[i] == -1 and a[i + 1] != -1) v.push_back(a[i + 1]);
  12. else if (a[i] != -1 and a[i + 1] == -1) v.push_back(a[i]);
  13. else if (a[i] != -1 and a[i] != -1) base = max(base, abs(a[i] - a[i + 1]));
  14. }
  15. if (v.empty()) {cout << "0 0\n"; continue;}
  16. sort(v.begin(), v.end());
  17. int k = (v.back() + *v.begin()) / 2;
  18. cout << max(max(v.back() - k, k - v[0]), base) << " " << k << "\n";
  19. }
  20. }

1301C. Ayoub’s function

题意:

函数 Codeforces Round #619 (Div. 2)A-D - 图23#card=math&code=f%28s%29) 代表,Codeforces Round #619 (Div. 2)A-D - 图24 字符串 Codeforces Round #619 (Div. 2)A-D - 图25 中包含至少一个 Codeforces Round #619 (Div. 2)A-D - 图26 的子串的数量。问你所有长度为 Codeforces Round #619 (Div. 2)A-D - 图27 ,其中有 Codeforces Round #619 (Div. 2)A-D - 图28Codeforces Round #619 (Div. 2)A-D - 图29Codeforces Round #619 (Div. 2)A-D - 图30 字符串中。使得 Codeforces Round #619 (Div. 2)A-D - 图31#card=math&code=f%28s%29) 的值最大为多少。

做法:

至少包含一个 Codeforces Round #619 (Div. 2)A-D - 图32 的子串的数量 Codeforces Round #619 (Div. 2)A-D - 图33 所有子串的数量 Codeforces Round #619 (Div. 2)A-D - 图34 只包含Codeforces Round #619 (Div. 2)A-D - 图35 的子串的数量。

所以要使得 Codeforces Round #619 (Div. 2)A-D - 图36#card=math&code=f%28s%29) 越大,只包含 Codeforces Round #619 (Div. 2)A-D - 图37 的子串的数量要越小越好,于是 Codeforces Round #619 (Div. 2)A-D - 图38 字符串中每一段的连续的 Codeforces Round #619 (Div. 2)A-D - 图39 的个数应尽可能一样。Codeforces Round #619 (Div. 2)A-D - 图40Codeforces Round #619 (Div. 2)A-D - 图41 ,有 Codeforces Round #619 (Div. 2)A-D - 图42Codeforces Round #619 (Div. 2)A-D - 图43 ,被分成 Codeforces Round #619 (Div. 2)A-D - 图44 段,长度为 Codeforces Round #619 (Div. 2)A-D - 图45%2F(m%2B1)%2B1#card=math&code=%28n-m%29%2F%28m%2B1%29%2B1) 的连续 Codeforces Round #619 (Div. 2)A-D - 图46 的段数为 Codeforces Round #619 (Div. 2)A-D - 图47%25(m%2B1)#card=math&code=%28n-m%29%25%28m%2B1%29) ,长度为 Codeforces Round #619 (Div. 2)A-D - 图48%2F(m%2B1)#card=math&code=%28n-m%29%2F%28m%2B1%29) 的连续 Codeforces Round #619 (Div. 2)A-D - 图49 的段数为 Codeforces Round #619 (Div. 2)A-D - 图50%25(m%2B1)#card=math&code=m%2B1-%28n-m%29%25%28m%2B1%29) 。再计算一下可得答案。

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int _; for (cin >> _; _--;) {
  4. ll n, m; cin >> n >> m;
  5. ll ans = n * (n + 1) / 2;
  6. ll num = (n - m) / (m + 1);
  7. ll r = (n - m) % (m + 1);
  8. cout << (ans - r * (num + 1) * (num + 2) / 2 - (m + 1 - r) * num * (num + 1) / 2) << "\n";
  9. }
  10. }

1301D. Time to Run

题意:

Codeforces Round #619 (Div. 2)A-D - 图51 的网格,相邻网格间有两条道路(不同方向)。问你能否不重复的走 Codeforces Round #619 (Div. 2)A-D - 图52 条路,可以的话输出路径。按题目要求。

Codeforces Round #619 (Div. 2)A-D - 图53

思路:

真就直接走完咯,先左右走,到最后一行只往右,到右下角之后上下走,ok,然后题目要求 Codeforces Round #619 (Div. 2)A-D - 图54 ,边走边减,到 Codeforces Round #619 (Div. 2)A-D - 图55 为止即可。 如果全部都走过了 Codeforces Round #619 (Div. 2)A-D - 图56 还有剩就输出 NO.

  1. int n, m, k;
  2. vector<pair<int, string>>v, ans;
  3. int main() {
  4. cin.tie(nullptr)->sync_with_stdio(false);
  5. cin >> n >> m >> k;
  6. for (int i = 0; i < n - 1; ++i) {
  7. if (m != 1) {
  8. v.push_back({m - 1, "R"});
  9. v.push_back({m - 1, "L"});
  10. }
  11. v.push_back({1, "D"});
  12. }
  13. if (m != 1) v.push_back({m - 1, "R"});
  14. for (int i = 0; i < m - 1; ++i) {
  15. if (n != 1) {
  16. v.push_back({n - 1, "U"});
  17. v.push_back({n - 1, "D"});
  18. }
  19. v.push_back({1, "L"});
  20. }
  21. if (n != 1) v.push_back({n - 1, "U"});
  22. for (int i = 0; i < v.size(); ++i) {
  23. if (k >= v[i].first) {
  24. k -= v[i].first;
  25. ans.push_back(v[i]);
  26. } else if (k != 0) {
  27. ans.push_back({k, v[i].second});
  28. k = 0;
  29. }
  30. }
  31. if (k > 0) cout << "NO\n";
  32. else {
  33. cout << "YES\n";
  34. cout << ans.size() << "\n";
  35. for (auto p : ans) cout << p.first << " " << p.second << "\n";
  36. }
  37. }