【洛谷CF1110E】Magic Stones
题目大意
多个询问,
每个询问给出长度为\(n\)的\(2\)个序列\(a,b\)
每次可以对\(1<i<n\)的\(a_i\)进行操作,
操作后,\(a'_i=a_{i-1}+a_{i+1}-a_i\)
问能否通过若干次操作,使得序列\(a\)变成\(b\)
题目分析
移项原式,得
\(a'_i-a_{i-1}=a_{i+1}-a_i\)
\(a_{i+1}-a'_i=a_i-a_{i-1}\)
发现只是交换差值
所以只要把\(a,b\)所有数的差值算出来,排序,再判断是否全等就好了
\(Code\)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define sco 100010
#define abs(x) ((x)<0?-(x):(x))
#define getcha() (S==T&&(T=(S=fsr)+fread(fsr,1,1<<15,stdin),S==T)?EOF:*S++)
using namespace std;
int a[sco],b[sco],x,y,M,n;
char fsr[1<<15],*S=fsr,*T=fsr;
inline int read(){
int r(0),w(1);char ch;
while(ch=getcha(),ch>=58 || ch<=47)w=(ch=='-'?-1:1);r=(r<<3)+(r<<1)+ch-48;
while(ch=getcha(),ch<=57 && ch>=48)r=(r<<3)+(r<<1)+ch-48;
return r*w;
}
int main(){
M=read();
while(M--){
n=read();x=y=0;x=read();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<n;++i){
y=read();
a[i]=abs(x-y);
x=y;
}
x=read();
for(int i=1;i<n;++i){
y=read();
b[i]=abs(x-y);
x=y;
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
bool f=0;
for(int i=1;i<n;++i){
if(a[i]!=b[i]){
f=1;break;
}
}
if(f==0){
putchar('Y');putchar('e');putchar('s');putchar(10);continue;
}
putchar('N');putchar('o');putchar(10);
}
return 0;
}