题目
对于每次操作
a
i
′
=
a
i
+
1
+
a
i
−
1
−
a
i
a_i'=a_{i+1}+a_{i-1}-a_i
ai′=ai+1+ai−1−ai
可以通过移项得到:
a
i
−
a
i
−
1
=
a
i
+
1
−
a
i
′
a_i-a_{i-1}=a{i+1}-a_i'
ai−ai−1=ai+1−ai′
和
a
i
+
1
−
a
i
=
a
i
′
−
a
i
−
1
\ \ 和\ \ a{i+1}-a_i=a_i'-a{i-1}
和 ai+1−ai=ai′−ai−1
意思是操作后的数,与左边的数之差,等于操作前的数与右边的数之差,
且操作后的数,与右边的数之差,等于操作前的数与左边的数之差,
即每次操作会交换
a
i
a_i
ai 与左右两数的差。
也就是说只要序列A的相邻数之间的差跟序列B一样(不分顺序),
那么肯定能通过若干次交换得到B。
代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int t,n,a[100100],b[100100],ac[100100],bc[100100];
inline int read()
{
char ch=getchar();
int x=0,fu=1;
while(ch<'0'||ch>'9')
{
if(ch=='-') fu=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*fu;
}
int main()
{
t=read();
while(t--)
{
n=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=n;++i) b[i]=read();
for(int i=1;i<n;++i)
{
ac[i]=abs(a[i]-a[i+1]);//求差值
bc[i]=abs(b[i]-b[i+1]);//求差值
}
sort(ac+1,ac+n);//排序,方便比较
sort(bc+1,bc+n);
bool ans=true;
for(int i=1;i<n;++i)
{
if(ac[i]!=bc[i]) ans=false;
}
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}