题解 CF1110E 【Magic Stones】

ChthollyTree

2019-02-08 08:30:17

Solution

题意: 给定一个长度为n的序列c 对于一个位置 i(1 < i < n) 可以进行如下变换操作 $c_{i}'$ = $c_{i+1} + c_{i-1} - c_{i}$ 问是否可以经过若干次操作变成序列t 作c序列的差分数组 就是定义 $a_{i}$ = $c_{i} - c_{i-1}$ 我们会发现 对于 $c_{i}$ 的一次变换,交换的差分数组的两个数 如$c_{i}'$ = $c_{i+1} + c_{i-1} - c_{i}$ 操作后 本来差分数组是 $c_{i}-c_{i-1}$ ,$c_{i+1}-c_{i}$ , 如今原序列变为 $c_{i-1}$ , $c_{i+1} + c_{i-1} - c_{i}$,$c_{i+1}$ 则手算可得差分数组为 $c_{i+1}-c_{i}$,$c_{i}-c_{i-1}$ , 这样就求出c,t的差分数组就行了 注意因为1,n无法更改,要特判 ``` #include<bits/stdc++.h> using namespace std; #define MAXN 100005 int n,m; int a[MAXN],b[MAXN]; int c[MAXN],d[MAXN]; void rd() { scanf("%d",&n); for(int i = 1; i <= n; i ++) scanf("%d",&a[i]); for(int i = 1; i <= n; i ++) scanf("%d",&b[i]); } int main() { rd();// if(a[1] != b[1]) {// cout<<"No";// return 0; } if(a[n] != b[n]) { cout<<"No"; return 0; } for(int i = 2; i <= n; i ++) { c[i-1] = a[i] - a[i-1]; d[i-1] = b[i] - b[i-1]; } sort(c+1,c+n);// sort(d+1,d+n);// for(int i = 1; i < n; i ++) if(c[i] != d[i]) {// cout<<"No";// return 0;// }// cout<<"Yes";// return 0;// }// /* 4 7 2 4 12 7 15 10 12 4 1 2 2 4 1 1 3 4 */ ```