成功拼手速提前过了AC两题,估计因为这个原因排名挺高的,B题晚上做的时候没绕出来,wa4发。。。


1401A - Distance and Axis

如果 Codeforces Round #665 (Div. 2) A - D题题解 - 图1 小 于 Codeforces Round #665 (Div. 2) A - D题题解 - 图2 ,则必须将Codeforces Round #665 (Div. 2) A - D题题解 - 图3移至坐标Codeforces Round #665 (Div. 2) A - D题题解 - 图4,并将B的坐标设置为0或k。 因此答案是Codeforces Round #665 (Div. 2) A - D题题解 - 图5
如果 Codeforces Round #665 (Div. 2) A - D题题解 - 图6不小于 Codeforces Round #665 (Div. 2) A - D题题解 - 图7,则将B的坐标定义为Codeforces Round #665 (Div. 2) A - D题题解 - 图8。 根据问题中的条件,Codeforces Round #665 (Div. 2) A - D题题解 - 图9Codeforces Round #665 (Div. 2) A - D题题解 - 图10之间的差应等于k。 即Codeforces Round #665 (Div. 2) A - D题题解 - 图11是k,并且总结公式 Codeforces Round #665 (Div. 2) A - D题题解 - 图12 。 因为B的坐标是整数,所以如果n和k的奇偶性相同,则答案为0,否则答案为1(如果将A的坐标增加1,则m变为整数)。
时间复杂度:O(1)

  1. #include<bits/stdc++.h>
  2. #define ms(a,b) memset(a,b,sizeof a)
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn = 1e5 + 100;
  6. int n, a[maxn], k;
  7. void solve() {
  8. cin >> n >> k;
  9. if (n == k)cout << 0 << endl;
  10. else if (n < k)cout << k - n << endl;
  11. else cout << ((n - k) % 2 == 0 ? 0 : 1) << endl;
  12. }
  13. int main() {
  14. //freopen("in.txt", "r", stdin);
  15. ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  16. int t; cin >> t;
  17. while (t--)solve();
  18. }

1401B - Ternary Sequence

我们可以找到ci值为3(−2,0,2)的种类。 并且只有当Codeforces Round #665 (Div. 2) A - D题题解 - 图13 为1且Codeforces Round #665 (Div. 2) A - D题题解 - 图14为2时Codeforces Round #665 (Div. 2) A - D题题解 - 图15才为−2,只有当Codeforces Round #665 (Div. 2) A - D题题解 - 图16为2且bi为1时Codeforces Round #665 (Div. 2) A - D题题解 - 图17才为2。否则Codeforces Round #665 (Div. 2) A - D题题解 - 图18为0。所以我们必须使(ai,bi)对(1,2) 尽可能少,并尽可能多地配对(2,1)。 为此,首先我们可以使(1,0)对,(0,2)对和(2,1)对尽可能多。 之后,将剩余值配对不会影响ci的总和。 (它的ai值为1,bi的值为2,尽管总和减少,我们必须将它们配对。)时间复杂度:O(1)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. ios_base::sync_with_stdio(0);
  5. cin.tie(0); cout.tie(0);
  6. int t; cin >> t;
  7. while(t--){
  8. int m, sum = 0, x0, x1, x2, y0, y1, y2;
  9. cin >> x0 >> x1 >> x2 >> y0 >> y1 >> y2;
  10. m = min(x0, y2);
  11. x0 -= m;
  12. y2 -= m;
  13. m = min(x1, y0);
  14. x1 -= m;
  15. y0 -= m;
  16. m = min(x2, y1);
  17. x2 -= m;
  18. y1 -= m;
  19. sum += 2 * m;
  20. sum -= 2 * min(x1, y2);
  21. cout << sum << endl;
  22. }
  23. }

1401C - Mere Array

让我们将a的最小元素定义为m。 我们发现不能被m整除的元素的位置无法更改,因为这些元素没有m作为因子。 但是我们可以通过以下方式任意重新排列可被m整除的元素:∙假设 Codeforces Round #665 (Div. 2) A - D题题解 - 图19 ,并且有两个元素Codeforces Round #665 (Div. 2) A - D题题解 - 图20Codeforces Round #665 (Div. 2) A - D题题解 - 图21都不同。 交换 Codeforces Round #665 (Div. 2) A - D题题解 - 图22。 然后只有Codeforces Round #665 (Div. 2) A - D题题解 - 图23从初始状态交换。 重复此过程。
因此,我们可以按降序重新排列可被m整除的元素。 之后,如果整个数组不降序,则答案为是,否则为否。
时间复杂度:Codeforces Round #665 (Div. 2) A - D题题解 - 图24

  1. #include<bits/stdc++.h>
  2. #define ms(a,b) memset(a,b,sizeof a)
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn = 1e5 + 100;
  6. int n, k;
  7. ll a[maxn], b[maxn];
  8. void solve() {
  9. cin >> n;
  10. ll minn = 1 << 30;
  11. bool flag = true;
  12. for (int i = 1; i <= n; ++i)cin >> a[i], minn = min(a[i], minn), b[i] = a[i];
  13. for (int i = 2; i <= n; ++i)if (a[i] < a[i - 1]) { flag = false; break; }
  14. if (flag) {
  15. cout << "YES" << endl;
  16. return;
  17. }
  18. sort(b + 1, b + 1 + n);
  19. flag = true;
  20. for (int i = 1; i <= n; ++i) {
  21. if (a[i] != b[i])
  22. if (gcd(a[i], minn) != minn) {
  23. flag = false;
  24. break;
  25. }
  26. }
  27. if (flag)cout << "YES" << endl;
  28. else cout << "NO" << endl;
  29. }
  30. int main() {
  31. //freopen("in.txt", "r", stdin);
  32. ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  33. int t; cin >> t;
  34. while (t--)solve();
  35. }

1401D - Maximum Distributed Tree

让我们将Codeforces Round #665 (Div. 2) A - D题题解 - 图25定义为将第 Codeforces Round #665 (Div. 2) A - D题题解 - 图26个边缘从树中移除时属于两个分量中的每个分量的顶点数量的乘积,并将Codeforces Round #665 (Div. 2) A - D题题解 - 图27定义为第Codeforces Round #665 (Div. 2) A - D题题解 - 图28个边缘上的数量。 现在分布指数等于Codeforces Round #665 (Div. 2) A - D题题解 - 图29。 现在有两种情况:

Codeforces Round #665 (Div. 2) A - D题题解 - 图30

在这种情况下,我们必须将Codeforces Round #665 (Div. 2) A - D题题解 - 图31标记为Codeforces Round #665 (Div. 2) A - D题题解 - 图32个不同的边缘,因为我们必须最小化Codeforces Round #665 (Div. 2) A - D题题解 - 图33的数量。 为了最大化分布指数,我们可以在Codeforces Round #665 (Div. 2) A - D题题解 - 图34较大的边缘标记一个较大的Codeforces Round #665 (Div. 2) A - D题题解 - 图35,因为以下条件成立:∙对于四个正整数Codeforces Round #665 (Div. 2) A - D题题解 - 图36。 然后可以将等式写成:(b + x)(d + y)+bd≥(b + x)d + b(d + y)

Codeforces Round #665 (Div. 2) A - D题题解 - 图37

Codeforces Round #665 (Div. 2) A - D题题解 - 图38

因为x,y≥0,所以证明了这一点。
并将标签1标记为其余边缘。
B:m> n-1在这种情况下,我们不能使n-1个整数中不存在1-s,并且n-1个数字中的一些将是复合的。 为了最大化分布指数,我们可以将Codeforces Round #665 (Div. 2) A - D题题解 - 图39的乘积标记到Codeforces Round #665 (Div. 2) A - D题题解 - 图40最大的边缘,并以与情况A相同的方式将剩余pi标记到其余边缘,因为以下条件成立:∙ 对于五个正整数Codeforces Round #665 (Div. 2) A - D题题解 - 图41代入上述方程式中的f = cd,我们发现方程式与之前相同。 因此,我们证明了这一点。
填充边缘后,计算并找到答案。
时间复杂度:Codeforces Round #665 (Div. 2) A - D题题解 - 图42

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. struct H { int x, y; };
  5. int ii, n;
  6. const int q = 1e9 + 7;
  7. LL p[100005], pv[100005], vi[100005], w[100005];
  8. H e[200040];
  9. int C(H a, H b) { return a.x < b.x; }
  10. int G(LL a, LL b) { return a > b; }
  11. LL dfs(int v){
  12. LL d = 1;
  13. vi[v] = 1;
  14. for (int i = pv[v]; i < pv[v + 1]; i++)
  15. if (!vi[e[i].y])
  16. d += dfs(e[i].y);
  17. w[ii] = d * (n - d);
  18. ii++;
  19. return d;
  20. }
  21. int main(){
  22. ios_base::sync_with_stdio(0);
  23. cin.tie(0);cout.tie(0);
  24. int t;cin >> t;
  25. while(t--){
  26. int k = 0, m;
  27. LL x = 1;
  28. cin >> n;
  29. for (int i = 0; i < n - 1; i++){
  30. cin >> e[i].x >> e[i].y;
  31. e[i + n - 1].x = e[i].y;
  32. e[i + n - 1].y = e[i].x;
  33. }
  34. int sz = 2 * n - 2;
  35. sort(e, e + sz, C);
  36. for (int i = 1; i < sz; i++)
  37. if (e[i].x > e[i - 1].x)
  38. for (int j = e[i - 1].x + 1; j <= e[i].x; j++)
  39. pv[j] = i;
  40. for (int j = e[sz - 1].x + 1; j <= n + 2;)
  41. pv[j] = sz;
  42. ii = k = 0;
  43. dfs(1);
  44. cin >> m;
  45. for (int i = 0; i < m; i++)
  46. cin >> p[i];
  47. sort(p, p + m, G);
  48. sort(w, w + n - 1, G);
  49. if (m < n)
  50. for (int i = m; i < n - 1; i++)
  51. p[i] = 1;
  52. else{
  53. int i;
  54. for (i = m - 1; i > m - n; k = i, i--)
  55. w[i] = w[i - m + n - 1];
  56. for (; i; i--)
  57. w[i] = w[0];
  58. }
  59. int l = max(m, n - 1);
  60. int i;
  61. for (i = 0, x = w[0]; i <= k; i++)
  62. x = x * p[i] % q;
  63. for (; i < l; i++)
  64. x = (x + w[i] * p[i]) % q;
  65. cout << x << endl;
  66. for (int i = 1; i <= n;)
  67. vi[i] = 0;
  68. }
  69. }