定义:
d
i
=
c
i
−
c
i
−
1
d_i = c_i - c_{i-1}
di=ci−ci−1
对于每次操作
c
i
′
=
c
i
+
1
+
c
i
−
1
−
c
i
c_i' = c_{i+1} + c_{i-1} - c_i
ci′=ci+1+ci−1−ci
d
i
′
=
c
i
′
−
c
i
−
1
=
c
i
+
1
+
c
i
−
1
−
c
i
−
c
i
−
1
=
d
i
+
1
d_i'=c_i'-c_{i-1}=c_{i+1}+c_{i-1}-c_i-c_{i-1}=d_{i+1}
di′=ci′−ci−1=ci+1+ci−1−ci−ci−1=di+1
d
i
+
1
′
=
c
i
+
1
−
c
i
′
=
c
i
+
1
−
(
c
i
+
1
+
c
i
−
1
−
c
i
)
=
d
i
d_{i+1}'=c_{i+1}-c_i'=c_{i+1}-(c_{i+1}+c_{i-1}-c_i)=d_i
di+1′=ci+1−ci′=ci+1−(ci+1+ci−1−ci)=di
因为序列的开头和结尾不能操作(若
c
1
c_1
c1为序列开头则
c
0
c_0
c0不在此序列中,
c
n
c_n
cn同理),所以若开头结尾不同,则无解。
code
#include<bits/stdc++.h>usingnamespace std;constint maxn =2e5+100;typedeflonglong LL;template<typename T>inlinevoidread(T &s){
s =0;
T w =1, ch =getchar();while(!isdigit(ch)){if(ch =='-') w =-1; ch =getchar();}while(isdigit(ch)){ s =(s <<1)+(s <<3)+(ch ^48); ch =getchar();}
s *= w;}int n;int a[maxn], t[maxn];int ca[maxn], ct[maxn];intmain(){// freopen("1.in", "r", stdin); read(n);for(int i =1; i <= n;++i)read(a[i]);for(int i =1; i <= n;++i)read(t[i]);if(a[1]^ t[1]|| a[n]^ t[n]){puts("No");exit(0);}for(int i =1; i <= n;++i){
ca[i]= a[i]- a[i -1];
ct[i]= t[i]- t[i -1];}sort(ca +1, ca + n +1);sort(ct +1, ct + n +1);for(int i =1; i <= n;++i){if(ca[i]^ ct[i]){puts("No");exit(0);}}puts("Yes");return0;}