題意:給出長度爲n的數組c和長度爲n的數組t,已知對於數組c的每一項都可以使得c[i]=c[i+1]+c[i-1]−c[i],判斷是否可以使得c數組變爲t數組。
題解:c[i]-c[i-1]=c[i+1]-c[i] c[i+1]-c[i]=c[i]-c[i-1] 這個變換的意思其實是交換差分數組相鄰的兩項,所以寫出c和t的差分數組排序後判斷是否相同,且c1==t1即可。
#include<bits/stdc++.h>
using namespace std;
#define Sheryang main
const int maxn=5e5+7;
typedef long long ll;
const int mod=1e7+7;
#define IO cin.tie(0),ios::sync_with_stdio(false);
#define pi acos(-1)
#define PII pair<ll,ll>
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
#define read read()
/** keep hungry and keep calm! **/
int a[maxn],b[maxn];
int Sheryang()
{
int n=read;
for(int i=1;i<=n;i++){
a[i]=read;
}
for(int i=1;i<=n;i++){
b[i]=read;
}
vector<int>v1,v2;
for(int i=2;i<=n;i++){
v1.push_back(a[i]-a[i-1]);
v2.push_back(b[i]-b[i-1]);
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
if(v1==v2 && a[1]==b[1]){
printf("YES\n");
}else{
printf("No\n");
}
return 0;
}