rt,我认为数据存在强度问题:
#include<bits/stdc++.h>
using namespace std;
int n,a[5000005],b[5000005],ans;
int mex(int l,int r){
if(l > r)swap(l,r);
if(l == 0 && r == 1) return 2;
else if(l == 0) return l + 1;
else return 0;
}
signed main(){
int T;
cin >> T;
while(T--){
ans = 0;
cin >> n;
bool f = 0,f2 = 0;
for(int i = 1;i <= n;++i) {cin >> a[i];f = (a[i] != i);}
for(int i = 1;i <= n;++i) if(a[i] != (i % 3)) f2 = 1;
if(!f){
cout << "No\n";
}
else if(!f2) {
if(n % 3 == 0) cout << "Yes\n";
else cout << "No\n";
}
else if(n <= 1005){
for(int i = 1;i < n;++i) b[i] = mex(a[i],a[i + 1]);
for(int k = 2;k < n;++k){
for(int i = 1;i < n - k + 1;++i) b[i] = mex(b[i],b[i + 1]);
}
if(b[1] == 2) cout << "Yes\n";
else cout << "No\n";
}
else{
if(n % 2 == 0){
for(int i = 1;i < n;++i) b[i] = mex(a[i],a[i + 1]);
--n;
for(int k = 1;k <= 2;++k){
--n;
for(int i = 1;i < n;++i) b[i] = mex(b[i],b[i + 1]);
}
if(b[(n + 1) / 2] == 2) cout << "Yes\n";
else cout << "No\n";
}
else {
for(int i = 1;i < n;++i) b[i] = mex(a[i],a[i + 1]);
--n;
for(int k = 1;k <= 3;++k){
--n;
for(int i = 1;i < n;++i) b[i] = mex(b[i],b[i + 1]);
}
if(b[(n + 1) / 2] == 2) cout << "Yes\n";
else cout << "No\n";
}
}
}
}
这一段代码只判断了中间为 2 的情况,然而并没有判断两边是否为 0,1 或者 1,0。这是怎么 AC 的?
附带我认为的正确代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[5000005],b[5000005],ans;
int mex(int l,int r){
if(l > r)swap(l,r);
if(l == 0 && r == 1) return 2;
else if(l == 0) return l + 1;
else return 0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while(T--){
ans = 0;
cin >> n;
bool f = 0,f2 = 0;
for(int i = 1;i <= n;++i) {cin >> a[i];f = (a[i] != i);}
for(int i = 1;i <= n;++i) if(a[i] != (i % 3)) f2 = 1;
if(!f){
cout << "No\n";
}
else if(!f2) {
if(n % 3 == 0) cout << "Yes\n";
else cout << "No\n";
}
else if(n <= 1005){
for(int i = 1;i < n;++i) b[i] = mex(a[i],a[i + 1]);
for(int k = 2;k < n;++k){
for(int i = 1;i < n - k + 1;++i) b[i] = mex(b[i],b[i + 1]);
}
if(b[1] == 2) cout << "Yes\n";
else cout << "No\n";
}
else{
if(n % 2 == 0){
for(int i = 1;i < n;++i) b[i] = mex(a[i],a[i + 1]);
--n;
for(int k = 1;k <= 2;++k){
--n;
for(int i = 1;i < n;++i) b[i] = mex(b[i],b[i + 1]);
}
if(b[(n + 1) / 2] == 2 && ((b[(n + 1) / 2 - 1] == 0 && b[(n + 1) / 2 + 1] == 1) || (b[(n + 1) / 2 - 1] == 1 && b[(n + 1) / 2 + 1] == 0))) cout << "Yes\n";
else cout << "No\n";
}
else {
for(int i = 1;i < n;++i) b[i] = mex(a[i],a[i + 1]);
--n;
for(int k = 1;k <= 3;++k){
--n;
for(int i = 1;i < n;++i) b[i] = mex(b[i],b[i + 1]);
}
if(b[(n + 1) / 2] == 2 && ((b[(n + 1) / 2 - 1] == 0 && b[(n + 1) / 2 + 1] == 1) || (b[(n + 1) / 2 - 1] == 1 && b[(n + 1) / 2 + 1] == 0))) cout << "Yes\n";
else cout << "No\n";
}
}
}
}