多校训练营加赛
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;
}
}
|
标签
题意
思路
代码
build本页面最近更新:2022/8/28 02:21:03,更新历史
edit发现错误?想一起完善? 在 GitHub 上编辑此页!
people本页面贡献者:
copyright本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用