AI智能
改变未来

Codeforces Round #648 (Div. 2) F. Swaps Again (思维+模拟)

题目链接:https://codeforces.com/contest/1365/problem/F

题意:给你一个数组a,每次只能选取一个数K交换前缀的K个数和后缀的K个数,问是否能变成数组b。

solution:先吐槽一下这题吧,个人觉得这题如果放在C题的位置都不过分。。然后说思路,先举个例子,1 2 3 4 5,可以变成5 2 3 4 1, 4 1 3 5 2, 2 1 3 5 4,多试几个样例发现对称的数经过交换后的位置依然是相对对称的,像这个例子中1和5,2和4的位置都是对称的,因此我们可以直接遍历b数组,如果b数组中存在对称的位置和a数组对称的位置的数字相同,那么直接标记表示该位置已经插入过,要特判一下n为奇数时最中间那个位置的数字是否相同。

代码:

[code]#include<bits/stdc++.h>using namespace std;typedef long long ll;int a[1000],b[1000],vis[1000];int main(){int t,n;cin>>t;while(t--){cin>>n;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];int l=1,r=n;bool flag=true;while(l<r){int f=0;for(int i=1;i<=n;i++){if(a[l]==b[i]&&a[r]==b[n-i+1]&&!vis[i]&&!vis[n-i+1]){vis[i]=1,vis[n-i+1]=1,f=1;break;}}if(!f){flag=false;break;}l++,r--;}if(n&1&&a[n/2+1]!=b[n/2+1]) flag=false;if(flag) cout<<\"Yes\"<<endl;else cout<<\"No\"<<endl;}return 0;}

 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Codeforces Round #648 (Div. 2) F. Swaps Again (思维+模拟)