列表

详情


NC231105. 小y的数组

描述

y有一个长度为n且元素互不相同的数组a_1,a_2,...,a_n,初始时有一次机会交换任意两个元素(可以不交换),每次他可以选择一个区间并把区间最大值赋值给与区间内最大值位置奇偶性相同的集合的一个子集,求是能否变成b_1,b_2,...,b_n

输入描述

第一行一个正整数T代表数据组数
接下来3T行每3行一组
第一行一个数n,接下来两行各n个数代表ab

输出描述

对于每组输入,如果数组a最终能变成数组b,输出YES,否则输出NO

示例1

输入:

2
5
2 3 5 4 1
5 4 5 4 5
3
2 3 1
3 3 1

输出:

YES
NO

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 1907ms, 内存消耗: 564K, 提交时间: 2022-02-24 22:55:35

// Author: wlzhouzhuan
#pragma GCC optimize(2,3,"Ofast")
#include<bits/stdc++.h>
using namespace std;

#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define mset(s,t) memset(s,t,sizeof(s))
#define mcpy(s,t) memcpy(s,t,sizeof(t))
#define SZ(x) ((int)x.size())
#define pb push_back
#define eb emplace_back
#define fir first
#define sec second

const int N=5005;

int pos[N],a[N],b[N],n;
int loc[N],L[N],R[N];

void init(){
	rep(i,1,n)loc[i]=-1;
	rep(i,1,n)loc[a[i]]=i;
	rep(i,1,n)assert(loc[i]!=-1);
	static int stk[N],top;
	stk[top=0]=0;
	rep(i,1,n){
		while(top&&a[stk[top]]<a[i])top--;
		L[i]=stk[top],stk[++top]=i;
	}
	stk[top=0]=n+1;
	per(i,n,1){
		while(top&&a[stk[top]]<a[i])top--;
		R[i]=stk[top],stk[++top]=i;
	}
}

bool check(){
	init();
	rep(i,1,n){
		if((loc[b[i]]&1)!=(i&1)){
			return 0;
		}
	}
	rep(i,1,n){
		if(a[i]>b[i]){
			return 0;
		}
	}
	rep(i,1,n){
		if(loc[b[i]]<i){
			if(R[loc[b[i]]]<i){
				// printf("fuck i=%d,R=%d\n",i,R[loc[b[i]]]);
				return 0;
			}
		}
		if(loc[b[i]]>i){
			if(L[loc[b[i]]]>i){
				// printf("fuck i=%d,L=%d\n",i,L[loc[b[i]]]);
				return 0;
			}
		}
	}
	return 1;
}

void solve(){
	cin>>n;
	rep(i,1,n)cin>>a[i];
	a[n+1]=0;
	rep(i,1,n){
		cin>>b[i];pos[i]=-1;
	}
	rep(i,1,n){
		if(!~pos[b[i]])pos[b[i]]=i&1;
		else if(pos[b[i]]!=(i&1))return puts("NO"),void();
	}
	if(check())return puts("YES"),void();
	
	init();

	vector<int> may;
	rep(i,1,n){
		if(a[i]>b[i]){
			may.pb(i);
			break;
		}
	}
	rep(i,1,n){
		if((loc[b[i]]&1)!=pos[b[i]]){
			may.pb(loc[b[i]]);
			break;
		}
	}
	
	rep(i,1,n){
		if(loc[b[i]]<i){
			if(R[loc[b[i]]]<i){
				may.pb(loc[b[i]]);
				may.pb(R[loc[b[i]]]);
				break;
			}
		}
		if(loc[b[i]]>i){
			if(L[loc[b[i]]]>i){
				may.pb(loc[b[i]]);
				may.pb(L[loc[b[i]]]);
				break;
			}
		}
	}
	for(auto &i:may){
		for(int j=1;j<=n;j++)if(j!=i){
			swap(a[i],a[j]);
			if(check()){
				return puts("YES"),void();
			}
			swap(a[i],a[j]);
		}
	}
	puts("NO");
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)solve();
	return 0;
}

上一题