Codeforces Round #648 (Div. 2) F - Swaps Again 题解(思维)

题目链接

题目大意

有两个长度为n的数组a和数组b,可以选择k(1<=k<=n/2)交换某一个数组的前缀k和后缀k,可以交换任意次数,看是否能使两个数组相等

思路

这个就是要发现一个关键就是有a[i],与a[n-i+1]他们始终对称就好判断了

代码

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=500+5;
int t,n,a[maxn],b[maxn];
pair<int,int> p1[maxn],p2[maxn];
int main(){
    scanf("%d",&t);
    while(t--){
        memset(p1,0,sizeof(p1));
        memset(p2,0,sizeof(p2));
        bool flag=1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&b[i]);
        }
        if(n%2==1&&a[n/2+1]!=b[n/2+1]){//中间这位不能变
            flag=0;
        }
        for(int i=1;i<=n/2;i++){
            p1[i]={max(a[i],a[n-i+1]),min(a[i],a[n-i+1])};
            p2[i]={max(b[i],b[n-i+1]),min(b[i],b[n-i+1])};
        }
        sort(p1+1,p1+1+n/2);
        sort(p2+1,p2+1+n/2);
        for(int i=1;i<=n/2;i++){
            if(p1[i]!=p2[i]){
                flag=0;
            }
        }
        if(flag){
            printf("yes\n");
        }else{
            printf("no\n");
        }
    }
    return 0;
}

你可能感兴趣的:(思维)