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;
}
posted @ 2023-10-18 01:08  zsxuan  阅读(3)  评论(0编辑  收藏  举报