NC231105. 小y的数组
描述
输入描述
第一行一个正整数代表数据组数接下来行每行一组第一行一个数,接下来两行各个数代表和
输出描述
对于每组输入,如果数组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; }