1478A. Nezzar and Colorful Balls

看半天题,然后才发现是统计最大值。

  1. int _;
  2. int main() {
  3. ios_base::sync_with_stdio(false), cin.tie(0);
  4. for (cin >> _; _--;) {
  5. int n;
  6. cin >> n;
  7. vector<int> a(n + 1, 0);
  8. for (int i = 0, x; i < n; ++i) cin >> x, a[x]++;
  9. cout << *max_element(a.begin(), a.end()) << "\n";
  10. }
  11. return 0;
  12. }

1478B. Nezzar and Lucky Number

  1. int _;
  2. int dp[1010];
  3. bool f(int x, int d) {
  4. while (x) {
  5. if (x % 10 == d) return true;
  6. x /= 10;
  7. }
  8. return false;
  9. }
  10. int main() {
  11. ios_base::sync_with_stdio(false), cin.tie(0);
  12. for (cin >> _; _--;) {
  13. int q, x, d;
  14. cin >> q >> d;
  15. vector<int> v(15, 1e9);
  16. for (int i = 1; i <= 100; ++i) {
  17. x = i % d;
  18. if (f(i, d)) v[x] = min(v[x], i);
  19. }
  20. for (int i = 1; i <= q; ++i) {
  21. cin >> x;
  22. if (v[x % d] <= x)
  23. cout << "YES\n";
  24. else
  25. cout << "NO\n";
  26. }
  27. }
  28. return 0;
  29. }

1478C. Nezzar and Symmetric Array

对d数组排个序,看一个每个出现的奇偶次数,其实 d 的顺序就是 a(绝对值) 的顺序对应过去的,两组应该是对称出现的。。

那可以按顺序求出对应的 a,要是求不出来或者出现重复,那么就失败,否则成功。

  1. int _;
  2. int main() {
  3. ios_base::sync_with_stdio(false), cin.tie(0);
  4. for (cin >> _; _--;) {
  5. int n;
  6. cin >> n;
  7. vector<ll> d(2 * n);
  8. for (auto& x : d) cin >> x;
  9. sort(d.rbegin(), d.rend()); // 注意这里是逆排
  10. bool yn = 1;
  11. ll sum = 0;
  12. for (int i = 2; i < 2 * n; i += 2)
  13. if (d[i] == d[i - 1]) yn = 0;
  14. for (int i = 0; i < n && yn; i++) {
  15. if (d[2 * i] != d[2 * i + 1]) {
  16. yn = 0;
  17. break;
  18. }
  19. if ((d[2 * i] - sum) <= 0 or (d[2 * i] - sum) % (n - i) != 0) {
  20. yn = 0;
  21. break;
  22. }
  23. ll cur = (d[2 * i] - sum) / (n - i);
  24. if (cur & 1) {
  25. yn = 0;
  26. break;
  27. }
  28. sum += cur;
  29. }
  30. cout << (yn ? "YES\n" : "NO\n");
  31. }
  32. return 0;
  33. }

1478D. Nezzar and Board

Codeforces Round #698 Div.2 (A~D题)个人题解记录 - 图1 x想成 Codeforces Round #698 Div.2 (A~D题)个人题解记录 - 图2 ,也就是x加上x 和y的差值,这个差值可以是正的也可以是负的。执行完之后我们可以对新的数字继续增加这个差值,所以我们就可以根据两个数字得出一个等差数列。数列内的数字都可以倍包含在数组a里。

而我们的目的是找出一个最小的差值 Codeforces Round #698 Div.2 (A~D题)个人题解记录 - 图3,然后分别比对每一个 Codeforces Round #698 Div.2 (A~D题)个人题解记录 - 图4看是否可以由 Codeforces Round #698 Div.2 (A~D题)个人题解记录 - 图5和若干个 Codeforces Round #698 Div.2 (A~D题)个人题解记录 - 图6 得到 k。先对 a 数组排个序,然后对所有的$ a[ i ]− a[ i − 1] $求 gcd,就得出了那个最小的差值 d。

  1. // RioTian 21/01/29
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. using ll = long long;
  5. int _, n;
  6. ll k;
  7. ll gcd(ll a, ll b) { return a % b == 0 ? b : gcd(b, a % b); }
  8. int main() {
  9. ios_base::sync_with_stdio(false), cin.tie(0);
  10. for (cin >> _; _--;) {
  11. cin >> n >> k;
  12. vector<ll> a(n + 1);
  13. for (int i = 1; i <= n; i++) cin >> a[i];
  14. sort(a.begin() + 1, a.end());
  15. ll tmp = a[2] - a[1];
  16. for (int i = 2; i < n; i++) tmp = gcd(tmp, a[i + 1] - a[i]);
  17. ll x = llabs(a[1] - k);
  18. cout << (x % tmp == 0 ? "YES\n" : "NO\n");
  19. }
  20. return 0;
  21. }