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序列交换得到,那么肯定某个数的对应元素肯定在两个数组中都一样

 

STL中pair容器的用法

代码:

 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 }

 

posted @ 2020-07-15 16:47  kongbursi  阅读(118)  评论(0编辑  收藏  举报