题解:here
每一次变换都会导致差分数组的两个相邻元素位置交换,但是大小是不变的;
要保证两个数组相等,所有的差分数组都是要一样的,包括第一个,也就是第一个数要相等
这里第一个数和最后一个数是不变的,所以题目正解为:比较这两个差分数组是否相同,如果相同,再看c数组和t数组第一个数是不是相同,是的话说明c数组可以变换到t数组
AC_Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<set> 5 #include<algorithm> 6 #include<iostream> 7 using namespace std; 8 typedef long long ll; 9 #define endl ' ' 10 const int maxn = 2e5+10; 11 const int inf = 0x3f3f3f3f; 12 13 int n; 14 int c[maxn],t[maxn],cfc[maxn],cft[maxn]; 15 16 bool judge(){ 17 for(int i=1;i<=n;i++){ 18 if( cfc[i]!=cft[i] ) return false; 19 } 20 return true; 21 } 22 23 int main() 24 { 25 scanf("%d",&n); 26 for(int i=1;i<=n;i++){ 27 scanf("%d",&c[i]); 28 if( i==1 ) cfc[i]=c[i]; 29 else cfc[i]=c[i]-c[i-1]; 30 } 31 for(int i=1;i<=n;i++){ 32 scanf("%d",&t[i]); 33 if( i==1 ) cft[i]=t[i]; 34 else cft[i]=t[i]-t[i-1]; 35 } 36 sort(cfc+1,cfc+1+n); 37 sort(cft+1,cft+1+n); 38 39 bool flag=judge(); 40 if( !flag ) printf("NO "); 41 else if( c[1]!=t[1] ) printf("NO "); 42 else printf("YES "); 43 return 0; 44 }