题目描述
有序列a和b,可以对 1 < i < n 1\ <\ i\ <\ n 1 < i < n的 a i a_i 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变成b
思路
我们变一下式子
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
a_i
ai两边的差分交换一下
所以我们把两个序列的差分弄出来
然后排个序看是否相同就行了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int A[100250], X[100250], Y[100250];
int n, T, F;
inline int read()
{
int x = 0, r = 1; char c = getchar();
while(c < '0' || c > '9'){if(c == '-')r = -1;c = getchar();}
while('0' <= c && c <= '9')x = x * 10 + c - 48, c = getchar();
return x * r;
}
int main()
{
T = read();
while(T--)
{
n = read();
memset(A, 0, sizeof(A));
A[1] = read();
for(int i = 2; i <= n; ++i)
A[i] = read(), X[i - 1] = A[i] - A[i - 1];
memset(A, 0, sizeof(A));
A[1] = read();
for(int i = 2; i <= n; ++i)
A[i] = read(), Y[i - 1] = A[i] - A[i - 1];
sort(X + 1, X + n);
sort(Y + 1, Y + n);
F = 1;
for(int i = 1; i < n; ++i)
if(X[i] != Y[i])
{
printf("No\n");
F = 0; break;
}
if(F)printf("Yes\n");
}
return 0;
}