CF1365F Swaps Again(思维)

题意:

给出两串序列a和b,每次操作可以选择其中一串序列,把它的前k个元素和最后k个元素交换,k<=n/2,询问是否有可能使得两个序列相等。

题解:

思考之后可以想到,数组中原来下标和为n+1的二元组,无论怎么交换,下标和永远是n+1。根据这个性质,可以提取出这些二元组,看看能不能完全匹配。

#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int t,n;
int a[maxn];
int b[maxn];
int visit[maxn];//标记二元组是否被使用 
int main () {
    scanf("%d",&t);
    while (t--) {
        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]),visit[i]=0;
        int f=1;
        for (int i=1;i<=n/2;i++) {
            int x=a[i];
            int y=a[n-i+1];
            f=0;
            for (int j=1;j<=n/2;j++) {
                if (visit[j]) continue;
                if ((b[j]==x&&b[n+1-j]==y)||(b[j]==y&&b[n+1-j]==x)) {
                    visit[j]=1;
                    f=1;
                    break;
                }
            }
            if (!f) break;
        } 
        if (n%2==1&&a[n/2+1]!=b[n/2+1]) f=0;
        if (f)
            printf("yes
");
        else
            printf("no
");
    }
} 
原文地址:https://www.cnblogs.com/zhanglichen/p/13093035.html