CEFqwq
2024-11-18 20:58:12
眼前一亮思维题。
看过 CEFqwq 写黑色思维题题解的真爱粉应该都知道 CEF 喜欢列举公理及推论,这篇题解也不例外。
下面记
我们不妨假设环是一个圆,连接
(没学过初中几何的同学可以查阅资料 qwq。)
一个点出发向两个不同点连边,所得两条弦交于圆上。
若两个相邻点权值相同,只保留其中一个点,不影响正确性。
证明:假设两点分别为
若
若
如果三个点连续,连了之后只有一条弧怎么办?这个时候连边对其余点没有任何影响。
概括一下就是,缩成一个点之后优弧上的点和劣弧上的点依旧可以连接
若相邻两个点为
证明:
我们先把相邻的
于是我们可以把剩下的
我们不妨开一个 vector
维护相邻,最后用桶统计。
#include<bits/stdc++.h>
using namespace std;
int lsh[] = {0, 2, 2, 3, 3}, t, n, buk[5];
vector<int> a;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> t;
while (t--){
cin >> n;
a.clear();
for (int i = 1; i <= n; i++){
int x;
cin >> x;
if (!a.empty() && lsh[x] == lsh[a.back()]){
if (lsh[x] == x)
a.back() = x;
}else
a.push_back(x);
}
if (lsh[a[0]] == lsh[a.back()]){
if (lsh[a[0]] != a[0]){
a[0] = a.back();
a.pop_back();
}else
a.pop_back();
}
buk[1] = buk[2] = buk[3] = buk[4] = 0;
for (auto x : a)
buk[x]++;
if (buk[1] >= buk[3] || buk[4] >= buk[2])
cout << "No\n";
else
cout << "Yes\n";
}
return 0;
}