Codeforces Round #648 (Div. 2) 参与排名人数13231
[codeforces 1365F] Swaps Again 以不变应万变
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1365/problem/F
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
F - Swaps Again | GNU C++17 | Accepted | 171 ms | 200 KB |
感觉:Div2对选手的手上模拟功夫要求还是比较高的。
题目大意:对于a数组,通过交换关于位置中心对称的元素,若能得到b数组,则是有效,若不能得到,则是无效。
基本思路:以不变应万变,关于位置中心对称的元素,无论怎么交换,都关于中心对称,可以考虑,将小的值放在中心的左边,大的值,放在中心的右边。
样例处理如下
4
1 2 3 2
3 1 2 2
Yes
数组a 1 2 3 2
数组b位置1 2 3 4
数组b 3 1 2 2
交换位置1,4
数组b 2 1 2 3
交换位置1,4
数组b 2 1 2 3
交换位置1,4
数组b 3 1 2 2
交换区间[1,2],[3,4]
数组b 2 2 3 1
交换位置1,4
数组b 1 2 3 2
至此,数组a与变化后的数组b雷同。
AC代码如下
#include <cstdio>
#include <algorithm>
#define maxn 510
using namespace std;
int n,a[maxn],b[maxn];
struct node{
int a,b;
}x[maxn],y[maxn];
int cmp(node a,node b){
return a.a==b.a?a.b<b.b:a.a<b.a;
}
void solve(){
int i,flag;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)scanf("%d",&b[i]);
for(i=1;i<=n/2;i++){
x[i]=(node){min(a[i],a[n+1-i]),max(a[i],a[n+1-i])};
y[i]=(node){min(b[i],b[n+1-i]),max(b[i],b[n+1-i])};
}
if(n&1){
x[n/2+1]=(node){-1,a[n/2+1]};
y[n/2+1]=(node){-1,b[n/2+1]};
}
sort(x+1,x+1+(n+1)/2,cmp);
sort(y+1,y+1+(n+1)/2,cmp);
flag=0;
for(i=1;i<=(n+1)/2;i++)
if(x[i].a!=y[i].a||x[i].b!=y[i].b){flag=1;break;}
if(flag)printf("No\n");
else printf("Yes\n");
}
int main(){
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}