质疑数据强度但是没有证据
查看原帖
质疑数据强度但是没有证据
895690
gghack_Nythix楼主2024/4/23 22:12

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";
			}
        }
	}
}

这一段代码只判断了中间为 22 的情况,然而并没有判断两边是否为 0,10,1 或者 1,01,0。这是怎么 ACAC 的?

附带我认为的正确代码:

#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";
			}
        }
	}
}
2024/4/23 22:12
加载中...