补题链接:Here

1511A. Review Site

题意:Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图1 个影评人,Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图2 有三种类型,如下

  • Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图3 ,则表示支持
  • Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图4 ,则表示不支持
  • Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图5 ,则表示无所谓

现在求最大的支持数。

思路:把 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图6 的累加即可

1511B. GCD Length

给定位数 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图7Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图8%20%3D%20c#card=math&code=gcd%28a%2Cb%29%20%3D%20c)

求出 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图9

思路:保持最高位基本一致为 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图10 ,接下来取 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图11 这样一定可以得到 gcd(x,y) = c

比赛的时候的猜想,现在证明不出来。。。

  1. void solve() {
  2. int a, b, c;
  3. cin >> a >> b >> c;
  4. for (int i = 0; i <= a - c; ++i) cout << 1;
  5. for (int i = 1; i < c; ++i) cout << 0;
  6. cout << " 1";
  7. for (int i = 1; i < b; ++i) cout << 0;
  8. cout << "\n";
  9. }

1511C. Yet Another Card Deck

题意:给定 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图12 张卡牌和 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图13 次操作,每次操作要执行输出下标(从1开始)、把该卡片放置最前面

由于卡牌种类仅 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图14 种,所以我可以枚举和变化下标

详细见代码

  1. void solve() {
  2. int n, q;
  3. cin >> n >> q;
  4. vector<int> a(n), idx(51);
  5. for (int &x : a) cin >> x;
  6. for (int i = n - 1; i >= 0; --i) idx[a[i]] = i;
  7. for (int i = 0, t; i < q; ++i) {
  8. cin >> t;
  9. cout << idx[t] + 1 << " ";
  10. for (int j = 1; j <= 50; ++j)
  11. if (j != t && idx[j] < idx[t]) idx[j]++; // 使原本在此卡牌之前的牌往后移
  12. idx[t] = 0;
  13. }
  14. }

另外看了下其他dalao的代码想起可以用树状数组做

1511D. Min Cost String

由于要满足 Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D) - 图15 次 cost,只要贪心拼接即可

  1. void solve() {
  2. int n, k;
  3. cin >> n >> k;
  4. string s;
  5. for (int i = 0; i < k; i++) {
  6. s += 'a' + i;
  7. for (int j = i + 1; j < k; j++) {
  8. s += 'a' + i;
  9. s += 'a' + j;
  10. }
  11. }
  12. // assert(s.size() == k * k);
  13. for (int i = 0; i < n; i += 1) cout << s[i % s.size()];
  14. }

1511E. Colorings and Dominoes

没怎么懂这么题,先贴一下学长的代码

  1. void solve() {
  2. int n, m;
  3. cin >> n >> m;
  4. vector<string> vs(n);
  5. for (int i = 0; i < n; ++i) cin >> vs[i];
  6. int k = n * m;
  7. vector<ll> pw(k + 1), ans(k + 1), pv(k + 1);
  8. for (int i = 0; i <= k; ++i) pw[i] = i ? pw[i - 1] * 2 % mod : 1;
  9. for (int i = 0; i <= k; ++i) pv[i] = i ? pv[i - 1] * (mod + 1) / 2 % mod : 1;
  10. ll sum = 0;
  11. for (int i = 1; i <= k; ++i) {
  12. if (i >= 3 and i % 2) sum = (sum + pv[i]) % mod;
  13. ans[i] = (ans[i - 1] * 2 + pw[i] * sum + (i % 2 == 0)) % mod;
  14. //cout << i << " " << ans[i] << "\n";
  15. }
  16. int w = 0;
  17. for (auto s : vs)
  18. for (char c : s) w += c == 'o';
  19. ll res = 0;
  20. for (int i = 0; i < n; ++i) {
  21. int p = 0;
  22. for (int j = 0; j <= m; ++j)
  23. if (j < m and vs[i][j] == 'o') p++;
  24. else {
  25. res = (res + ans[p] * pw[w - p]) % mod;
  26. p = 0;
  27. }
  28. }
  29. for (int i = 0; i < m; i++) {
  30. int p = 0;
  31. for (int j = 0; j <= n; j++)
  32. if (j < n and vs[j][i] == 'o') p++;
  33. else {
  34. res = (res + ans[p] * pw[w - p]) % mod;
  35. p = 0;
  36. }
  37. }
  38. cout << res;
  39. }