Codeforces Round #648 (Div. 2) F. Swaps Again
题目链接:F、Swaps Again
题意:
有两个长度为n的数组a和数组b,可以选择k(1<=k<=n/2)交换某一个数组的前缀k和后缀k,可以交换任意次数,看最后是否能使两个数组相等
可以输出yes,否则输出no
题解:
。。。这道题我真没想到这样写
例如一个序列1,2,3,4,5.你交换一次(怎么交换就不说了,能看出来),5,2,3,4,1,再交换一次4,1,3,5,2.
你会发现一个规律(反正我没发现),对称位置的元素依然是最开始的元素,就比如没交换前1和5相对称,再交换了多次之后1还是和5处于对称位置
那么如果b序列可以通过a序列交换得到,那么肯定某个数的对应元素肯定在两个数组中都一样
代码:
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string> 5 #include<queue> 6 #include<deque> 7 #include<string.h> 8 #include<map> 9 #include <iostream> 10 #include <math.h> 11 using namespace std; 12 typedef long long ll; 13 const int maxn=500+10; 14 int a[maxn],b[maxn]; 15 pair<int,int> p1[maxn],p2[maxn]; 16 int main() 17 { 18 int t; 19 scanf("%d",&t); 20 while(t--) 21 { 22 int n; 23 memset(p1,0,sizeof(p1)); 24 memset(p2,0,sizeof(p2)); 25 bool flag=0; 26 scanf("%d",&n); 27 for(int i=1; i<=n; i++) 28 { 29 scanf("%d",&a[i]); 30 } 31 for(int i=1; i<=n; i++) 32 { 33 scanf("%d",&b[i]); 34 } 35 if(n%2==1&&a[n/2+1]!=b[n/2+1]) //中间这位不能变 36 { 37 flag=1; 38 } 39 for(int i=1; i<=n/2; i++) 40 { 41 p1[i]= {max(a[i],a[n-i+1]),min(a[i],a[n-i+1])}; 42 p2[i]= {max(b[i],b[n-i+1]),min(b[i],b[n-i+1])}; 43 } 44 sort(p1+1,p1+1+n/2); 45 sort(p2+1,p2+1+n/2); 46 for(int i=1; i<=n/2; i++) 47 { 48 if(p1[i]!=p2[i]) 49 { 50 flag=1; 51 } 52 } 53 if(flag==0) 54 { 55 printf("yes\n"); 56 } 57 else 58 { 59 printf("no\n"); 60 } 61 } 62 return 0; 63 }