多校训练营加赛

J:Jellyfish and its dream

z3475

标签

题意

给定长度为,0下标开始的数列,每次可以选择满足使。求能否使变成全部元素相同的数列。

思路

将数列延伸一倍拆环建立,发现其一段区间能变成相同的数。如果使最小,的所有元素都不会影响的值。所以可以定义为以的最小。初始化所有,当且仅当,又因为区间连续,所以不断将即可。

时间复杂度自证不难

代码
参考代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <bits/stdc++.h>
using namespace std;
struct FAST_IO {
  FAST_IO() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
  }
} __fast_io;

constexpr int nxt[3] = {1, 2, 0};

int a[1000000 + 1], b[2000000 + 1];
int s[2000000 + 1];
int main() {
  int T;
  cin >> T;
  while (T--) {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
      cin >> a[i];
    cout << ([&]() {
      for (int i = 0; i < n; i++) {
        b[i] = a[i];
        int j = i;
        while (j > 0 && nxt[b[i]] != b[j - 1])
          j = s[j - 1];
        s[i] = j;
        if (i - s[i] + 1 >= n)
          return true;
      }
      for (int i = n; i < n * 2; i++) {
        b[i] = a[i - n];
        int j = i;
        while (j > 0 && nxt[b[i]] != b[j - 1])
          j = s[j - 1];
        s[i] = j;
        if (i - s[i] + 1 >= n)
          return true;
      }
      return false;
    }()
                 ? "Yes"
                 : "No")
         << endl;
  }
}

K:Killer Sajin's Matrix

标签
题意
思路
代码

评论