差分题目。。。很神奇。。。
看了公式就会发现很简单,是个构造。。。
c i ' = c i+1 + c i-1 - c i
= c i+1 - ci + c i-1
我们发现 出现了一个 ci+1 - ci, 那么我们很显然,可以尝试构造一个 新式子
di = ci+1 - ci
那么 di ' = ci+1 - ci+1 + c i - c i-1 = d i-1
很显然,进行了一次交换,那么我们如此构造一个新数组,sort 一下判断数字个数是否一样就好了,
但是 因为 我们这么做的默认规则是 n >= 2 如果 第一项 不相等, 那么很显然, 第一项需要一步特判。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
inline int read()
{
register int s=0,w=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
int s[maxn],t[maxn];
int ds[maxn],dt[maxn];
int main()
{
int n=read();
for(int i=1;i<=n;i++)s[i]=read();
for(int i=1;i<=n;i++)t[i]=read();
if(s[1]!=t[1])
{
cout<<"No"<<endl;
return 0;
}
int tot=0;
for(int i=2;i<=n;i++)
ds[++tot]=s[i]-s[i-1],
dt[tot]=t[i]-t[i-1];
sort(ds+1,ds+1+tot); sort(dt+1,dt+1+tot);
bool fl = true;
for(int i=1;i<=tot;i++)
{
if(ds[i] != dt[i])
{
fl = false;
break;
}
}
if(fl)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}