链接
题目描述
多个询问,每次询问给出长度为n的序列a,b,每次可以让ai’ = a[i+1] + a[i-1]-a[i],问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数组的左右差分交换
比较a数组和b数组的差分就好了
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T, n, a[100005], b[100005], d[100005], d2[100005];
int read()
{
int x = 0, flag = 1; char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') flag = -1; ch = getchar();}
while (ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
return x * flag;
}
int main()
{
T = read();
for(int i = 1; i <= T; ++i)
{
bool c = 0;
n = read();
for(int j = 1; j <= n; ++j)
a[j] = read(), d[j] = a[j] - a[j - 1];
for(int j = 1; j <= n; ++j)
b[j] = read(), d2[j] = b[j] - b[j - 1];
sort(d + 1, d + n + 1);
sort(d2 + 1, d2 + n + 1);
for(int j = 1; j <= n; ++j)
if(d[j] != d2[j]) {
printf("No\n");
c = 1;
break;
}
if(!c) printf("Yes\n");
}
}