Codeforces 1110E
给定一个长为$n$的序列$a$,定义一次操作为将$a_i(1<i<n)$变为$a_{i-1}+a_{i+1}-a_i$。再给一个长为$n$的序列$b$,问$a$能否通过一系列操作变为$b$。
$$n\le10^5,a_i,b_i\le2\times10^9$$
考虑差分,则每次操作相当于交换了差分数组的两个相邻位置,因此只需要判一下差分数组是否一致以及$a_1$是否等于$b_1$即可。
1 const int MAXN = 100000 + 5; 2 3 int a[MAXN], b[MAXN]; 4 5 int main() { 6 int n; 7 scanf("%d", &n); 8 For(i, 1, n) { 9 scanf("%d", &a[i]); 10 } 11 For(i, 1, n) { 12 scanf("%d", &b[i]); 13 } 14 if (a[1] != b[1] || a[n] != b[n]) { 15 puts("No"); 16 exit(0); 17 } 18 FOR(i, 1, n) { 19 a[i] = a[i + 1] - a[i]; 20 b[i] = b[i + 1] - b[i]; 21 } 22 std::sort(a + 1, a + n); 23 std::sort(b + 1, b + n); 24 FOR(i, 1, n) { 25 if (a[i] != b[i]) { 26 puts("No"); 27 exit(0); 28 } 29 } 30 puts("Yes"); 31 return 0; 32 }