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 }

 

posted @ 2019-02-09 17:41 sjkmost 阅读(...) 评论(...) 编辑 收藏