Codeforces Round 888 (Div. 3) C. Tiles Comeback
有 \(n\) 个瓷砖和一个正整数 \(k\) ,第 \(i\) 个瓷砖染色为 \(c_i\) 。你一开始在第 \(1\) 块瓷砖上,可以向右跳到任意一个位置的瓷砖。你可以得到一个长为 \(p\) 的路径,长度代表你曾经站过的瓷砖。
你需要确定是否存在一条长度为 \(p\) 的路径满足以下条件:
- 路径终点在第 \(n\) 块瓷砖
- \(k \mid p\)
- 这条路径可以按长度为 \(k\) 进行分块
- 每块内的瓷砖颜色一样,且不要求相邻两块的颜色不一样
我们需要构建 \(x\) 个 \(block\) 满足每个 \(bolck\) 大小为 \(k\) ,颜色一样,且第 \(1\) 块瓷砖和第 \(n\) 块瓷砖可以在 \(block\) 中.
显然,第 \(1\) 块瓷砖和第 \(n\) 块瓷砖的 \(block\) 以外,其他 \(block\) 的构建并没有意义。
于是若 \(c_1 = c_n\) ,可以判断是否可以构建一个 \(block\) 。
若 \(c_1 \neq c_n\) ,可以判断是否可以构建 \(1 \in block_1, n \in block_2\) ,且 \(block_1\) 和 \(block_2\) 没有交。
view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
int n, k; std::cin >> n >> k;
std::vector<int> a(n+1);
for (int i = 1; i <= n; i++) std::cin >> a[i];
if (a[1] == a[n]) {
int cnt = 0;
for (int i = 1; i <= n; i++) cnt += a[i] == a[1];
std::cout << (cnt >= k ? "YES" : "NO") << '\n';
}
else {
int L = 1, cntl = 0;
while (L <= n && cntl < k) cntl += a[L] == a[1], L += 1;
L -= 1;
int R = n, cntr = 0;
while (R >= 1 && cntr < k) cntr += a[R] == a[n], R -= 1;
R += 1;
std::cout << (L < R ? "YES" : "NO") << '\n';
}
}
int main() {
int _ = 1; std::cin >> _;
while (_--) {solve();}
return 0;
}
——现在有无穷的乐子,但不该透支向未来。
——永远是挑战而不是练习,下次一定更好。